使用 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的时区问题,但如果是这样的话,为什么它在美国/芝加哥显示“现在”错误?
答案 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)
。