2025年PHP中的日期和时间:别再犯这5个错误

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

时间不等人:为什么PHP中处理日期如此复杂(以及如何解决)



想象一下:您正在编写一个博客、一个在线商店或一个个人账户。然后突然意识到——需要向用户显示文章是何时发布的、订单是何时创建的或消息是何时发送的。看起来,这能有多难?使用 date() 函数——就搞定了。



但是,魔鬼总是在细节中。在2025年,PHP开发者仍然在犯同样的错误:混淆时区、忘记对象的不可变性、使用过时的函数。然后他们惊讶地发现网站上的时间“跳跃”,测试失败。



在本文中,我们将探讨在PHP中处理日期和时间的最佳实践——从简单的解决方案到专业技巧。您将了解如何获取当前日期、如何处理时区,以及如何在使用时间戳时避免搬起石头砸自己的脚。



1. 最简单的方法:date() 函数



我们从经典开始。date() 函数是90%的新手开始的地方。它接受两个参数:输出格式和(可选的)时间戳。如果未指定时间戳,则使用服务器的当前时间。



echo date('Y-m-d H:i:s');// 输出:2025-04-08 14:35:12


以下是最流行的格式:

  • Y — 年份(4位数字)
  • m — 月份(01–12)
  • d — 月份中的日期(01–31)
  • H — 24小时制的小时
  • i — 分钟
  • s — 秒


问题: date() 依赖于 php.ini 中的 date.timezone 设置。如果您没有设置时区,PHP将使用服务器的系统时间。而服务器可能位于不同的时区——那么您的用户将看到错误的时间。



2. 专业方法:DateTime 类



从PHP 5.2开始,我们有了DateTime 类。这是一种面向对象的日期处理方式,比 date() 和 time() 函数更加灵活和安全。



$now = new DateTime();echo $now->format('Y-m-d H:i:s');// 输出:2025-04-08 14:35:12


DateTime 的优点:

  • 可以通过构造函数轻松设置时区
  • 支持日期修改(添加天数、月份)
  • 能够比较日期
  • 支持时间间隔


带时区的示例:



$now = new DateTime('now', new DateTimeZone('Europe/Moscow'));echo $now->format('Y-m-d H:i:s');// 输出:2025-04-08 17:35:12 (MSK, UTC+3)


2.1. DateTimeImmutable — 您的新好朋友



在PHP 5.5中,引入了DateTimeImmutable。它与普通 DateTime 的主要区别在于:它不会修改自身。相反,每个方法(例如 modify() 或 add())都会返回一个新对象。



$date = new DateTimeImmutable();$modified = $date->modify('+1 day');

echo $date->format('Y-m-d'); // 2025-04-08 (未改变!)echo $modified->format('Y-m-d'); // 2025-04-09 (新对象)


为什么这很重要?因为普通的 DateTime 是一个引用对象。如果您将其传递给一个函数并在其中修改它,原始对象也会被修改。使用 Immutable 则没有这个问题。在2025年,这被认为是严肃项目的事实标准。



3. 如何获取时间戳:time() 与 DateTime



有时您需要的不是日期,而是Unix 时间戳——自1970年1月1日以来的秒数。PHP提供了两种方式:



// 旧方法echo time();  // 1744112112

// 新方法echo (new DateTime())->getTimestamp(); // 1744112112


对于简单的任务,time() 完全够用

博客

书籍推荐