PHP日期时间格式不考虑时区?

PHP日期时间格式不考虑时区?,php,datetime,Php,Datetime,因此,我有以下代码: $timezone = new DateTimeZone('America/New_York'); $datetime = new DateTime(date('r', 1440543600), $timezone); echo $datetime->format('l, F j, Y - h:i A e'); 这将产生以下结果: 2015年8月25日星期二-晚上11:00+00:00 你会认为它会输出: 2015年8月25日星期二-晚上7:00-04:00 如何

因此,我有以下代码:

$timezone = new DateTimeZone('America/New_York');
$datetime = new DateTime(date('r', 1440543600), $timezone);

echo $datetime->format('l, F j, Y - h:i A e');
这将产生以下结果:

2015年8月25日星期二-晚上11:00+00:00

你会认为它会输出:

2015年8月25日星期二-晚上7:00-04:00


如何使用设置的时区正确输出格式?

我认为问题不在于如何输出日期,而在于如何输入日期。“r”格式选项包括时间偏移

如果您使用一个没有偏移量的字符串创建DateTime对象,您将得到预期的结果

$timezone = new DateTimeZone('America/New_York');
$datetime = new DateTime("2015-08-20 01:24", $timezone);

echo $datetime->format('l, F j, Y - h:i A e');

$datetime->setTimezone(new DateTimeZone('America/Chicago'));
echo "\n";
echo $datetime->format('l, F j, Y - h:i A e');

/* outputs

Thursday, August 20, 2015 - 01:24 AM America/New_York
Thursday, August 20, 2015 - 12:24 AM America/Chicago

*/

有关示例,请参阅。

请阅读文档,其中第二个参数为:

注意:$timezone参数和当前时区被忽略 $time参数为UNIX时间戳时(例如@946684800) 或指定时区(例如,2010-01-28815:00:00+02:00)

基于此,在使用unix时间戳创建DateTime对象后,在该对象上设置时区:

$timezone=新日期时区(“美国/纽约”);
$datetime=newdatetime(“@1440543600”);
$datetime->setTimezone($timezone);

我认为事情没有那么简单。。。将
'r'
替换为
'Y-m-d H:i'
仍然会导致相同的问题。我会尝试运行
日期('Y-m-d H:i',$timestamp)
,以确保您的服务器提供了您认为是的时间偏移量。从我观察到的任何时候,我给构造函数一个硬编码的值,它的行为是正常的。
date()
调用的中间结果是什么?顺便说一句:我发现使用
DateTime::createFromFormat()
更为健壮,这并不是猜测。在这里,您可以使用
'U'
格式直接解析Unix时间戳。查看有关$timezone的文档:我不明白为什么PHP在这些情况下会忽略时区。它没有意义,特别是当提供了时间戳时。@RoboRobok:如果提供了时区,则忽略第二个参数,这是完全有意义的。我的意思是,当我使用类似于
newdatetime('@1440543600',newdatetimezone('America/new_York'))
的东西时,我希望类似于假设我的时间戳是UNIX,我希望结果是纽约时区。忽略时区有什么意义?@RoboRobok:请阅读此链接上的
时区
参数注释:。Unix时间戳已经在UTC时区中,因此您的自定义时区将被忽略。我知道,我想了解它背后的逻辑。我在谷歌上搜索了这个问题以找出原因。