Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用时间戳返回错误结果的Php DateTime实例_Php_Datetime_Timestamp_Unix Timestamp - Fatal编程技术网

使用时间戳返回错误结果的Php DateTime实例

使用时间戳返回错误结果的Php DateTime实例,php,datetime,timestamp,unix-timestamp,Php,Datetime,Timestamp,Unix Timestamp,我一直使用php DateTime,我刚刚在一个旧的应用程序上做了一些工作,该应用程序使用date()处理所有事情。我注意到我的DateTime时间与date()时间不匹配。这让我相当担心 最后,我在本地进行了一些测试,发现当使用unix时间戳(格式为“@1365389490”)进行实例化时,DateTime在本地计算机上给出的结果不正确。他们落后了12个小时(或更多,取决于夏令时) 请注意,我已经在我的MAMP Pro安装中使用PHP5.2.17、5.3.14和5.4.4对这些进行了测试(是的

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

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

请注意,我已经在我的MAMP Pro安装中使用PHP5.2.17、5.3.14和5.4.4对这些进行了测试(是的,我在每次尝试之前都重新启动了apache)。我还在PHP5.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文档,当您将时区传递给DateTime构造函数时,时区将被忽略。时间对我来说是UTC(尽管我的应用程序时区设置为太平洋/奥克兰)

从文档中:


@
实例化
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

谢谢你,杰克。在那里的文档里也有这样的描述。我读了它,没有想到任何事情,因为我认为在应用程序的其余部分,将默认时区设置为Pacific/Auckland可以解决这个问题。显然不是。再次感谢。@James我不知道为什么会选择这个设计,但至少有文档记录;-)
// 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";
$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