2.15. 处理日期和时间
使用 DateTime 类。
在 PHP 过去糟糕的日子里,我们不得不混合使用令人困惑的 date(), gmdate(), date_timezone_set(), strtotime() 来处理日期和时间。遗憾的是,你至今仍可以在网上找到很多教程,还在用着这些难用且过时的函数。
幸好,我们正在讨论的 PHP 版本具有更友好的 DateTime
类 。该类将所需功能和大量以前的日期函数封装在一个易于使用的类中,并使时区转换更加简单。始终使用 DateTime
类在 PHP 中实现日期的创建、比较、更改和显示。
范例
<?php
// 构造一个新的 UTC 日期。除非你真的清楚自己在做什么,否则请始终指定 UTC!
$date = new DateTime('2011-05-04 05:00:00', new DateTimeZone('UTC'));
// 在初始日期上增加十天
$date->add(new DateInterval('P10D'));
print($date->format('Y-m-d h:i:s')); // 2011-05-14 05:00:00
// 遗憾的是,我们没有中土时区(魔戒梗)
// 将 UTC 日期转换为 PST(或PDT,取决于具体需要)时区
$date->setTimezone(new DateTimeZone('America/Los_Angeles'));
// 请注意,你自己运行这一行代码,根据当地夏令时的不同,结果可能会相差一小时
print($date->format('Y-m-d h:i:s')); // 2011-05-13 10:00:00
$later = new DateTime('2012-05-20', new DateTimeZone('UTC'));
// 比较两个日期
if($date < $later){
print('是的,你可以使用这些简单的运算符直接比较日期!');
}
// 找出两个日期之间的差异
$difference = $date->diff($later);
print('第二个日期比第一个日期晚了 ' . $difference->days . ' 天。');
要点
如果未指定时区,则 DateTime::__construct() 会自动将结果日期的时区设置为 正在运行的计算机所在时区。这可能会在以后导致严重且棘手的问题。创建新日期时始终指定 UTC 时区,除非你确实知道自己在做什么。
如果在 DateTime::__construct() 中使用 Unix 时间戳,时区将始终自动设置为 UTC ,而不管在第二个参数中指定了什么时区。
将零日期(例如“0000-00-00”,MySQL 通常将此值作为 DateTime 列中的默认值)传递给 DateTime::__construct() 将生成一个无意义的日期,而不是“0000-00-00”。
在 32 位系统上使用 DateTime::getTimestamp() 将无法表示超过 2038 年的日期,64位系统不存在这个问题。
延伸阅读
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: