4

我一直使用 php DateTime,我刚刚在一个使用 date() 处理所有内容的旧应用程序上做了一些工作。我注意到我的 DateTime 时间与 date() 时间不匹配。这让我相当担心。

我最终在本地进行了一些测试,发现 DateTime 在使用 unix 时间戳(格式为“@1365389490”)实例化时在我的本地机器上给出了不正确的结果。他们落后 12 小时(或更多,取决于夏令时)。

请注意,我已经在我的 MAMP Pro 安装中使用 php 5.2.17、5.3.14 和 5.4.4 测试了这些(是的,我在每次尝试之前都重新启动了 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";
4

1 回答 1

3

实例化 a不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
于 2013-04-08T03:31:13.057 回答