PHP DateTime不一致?我错过了什么?

时间:2010-10-21 16:07:40

标签: php datetime

使用 PHP 5.2.5 我正在使用一些DateTime对象并注意到一段时间似乎已关闭。我遇到的问题可能与时区有关,但我不确定 - 我正在从Unix时间戳创建一个DateTime,并根据我输出的方式获得不同/意外的结果。

我创建了以下内容以轻松说明“问题”:

$timezone = new DateTimeZone('America/Chicago'); 
$now = time(); 
$now_datetime = new DateTime('@' . $now, $timezone); 
echo phpversion() . "\n\n"; 
echo $now . "\n"; 
echo $now_datetime->format('U') . "\n\n"; 
echo date('g:i:sa', $now) . "\n";
echo $now_datetime->format('g:i:sa') . "\n\n";

这输出以下内容:

5.2.5

1287676530
1287676530

10:55:30am
3:55:30pm

我目前处于正确的时区,服务器显示“正确”时间(上午10点),当使用date()功能输出格式化日期时,以及“America / Chicago”是默认值该机器上的时区。但是,当通过DateTime::format()输出值时,时间是非常不同的。

我添加->format('U')只是为了验证它是否保持正确的时间戳。

所以,我可能做错了,或者我错误的期望。那么我缺少什么

这似乎是DateTime的时区问题,但如果是这样的话,为什么它在美国/芝加哥显示“现在”错误?

2 个答案:

答案 0 :(得分:1)

manual on DateTime's constructor有答案:

  

当$ time参数是UNIX时间戳(例如@ 946684800)或指定时区(例如2010-01-28T15:00:00 + 02:00)时,将忽略$ timezone参数和当前时区。 / p>

这意味着您的时间戳被视为GMT时间戳,解释了7小时的差异。

答案 1 :(得分:1)

您'插入'到DateTime的时区是字符串的时区,可能不是您当前的时区,因此PHP可以计算实际的日期时间,而不是它用于format您的时区的时区输出。如果您希望输出特定时区的时间,请使用$now_datetime->setTimezone($timezone)