我一直使用php DateTime,我刚刚在一个使用date()的旧应用程序上完成了一些工作。我注意到我的DateTime时间与date()次数不匹配。这让我非常担心。
我最终在本地进行了一些测试,发现当使用unix时间戳(格式为“@ 1365389490”)进行实例化时,DateTime在本地计算机上提供的结果不正确。它们落后12小时(或者更多取决于夏令时)。
请注意我已经使用php 5.2.17,5.3.14和5.4.4在我的MAMP Pro安装中测试了这些(是的,我在每次尝试之前重新启动了apache)。我还在php 5.3.6上的开发服务器上进行了测试。所有这些都输出了错误的值。
# To confirm date() uses the right timezone
date_default_timezone_set("Pacific/Auckland");
$ts = '1365389490'; # 02:51:30pm 08/04/2013
# This shows correctly (02:51:30pm 08/04/2013)
echo date("h:i:sa d/m/Y", $ts) . "<br /><br />";
# This shows incorrectly (02:51:30am 08/04/2013)
$dateTime = new DateTime("@".$ts, new DateTimeZone("Pacific/Auckland"));
echo $dateTime->format("h:i:sa d/m/Y");
奇怪的是这种替代方式有效。这是旧的PHP 5.2及更早版本的方法。
$dateTime = new DateTime();
$dateTime->setTimestamp($ts);
echo $dateTime->format("h:i:sa d/m/Y");
这是基本的东西。我不知道为什么它不表现自己。任何帮助将非常感激。
根据php文档,当您将时区传递给DateTime构造函数时,会忽略时区。时间对我来说是UTC(尽管我的应用时区设置为太平洋/奥克兰)。
来自文档:http://php.net/manual/en/datetime.construct.php
// Using a UNIX timestamp. Notice the result is in the UTC time zone.
$date = new DateTime('@946684800');
echo $date->format('Y-m-d H:i:sP') . "\n";
答案 0 :(得分:3)
使用DateTime
实例化@
不使用时区,因此您必须在之后设置时区:
$dateTime = new DateTime("@".$ts);
$dateTime->setTimezone(new DateTimeZone("Pacific/Auckland"));
echo $dateTime->format("h:i:sa d/m/Y");
// 02:51:30pm 08/04/2013