打印DateTime时的不同行为取决于时区的设置方式

时间:2018-04-04 12:40:20

标签: php timezone

为什么我会根据我在下面两个代码段中设置时区的方式获得不同的日期?

// Setting timezone using setTimezone' 
$date1 = DateTime::createFromFormat('Y-m-d H:i:s', '2018-04-04 12:00:00');
$date1->setTimezone(new DateTimeZone('UTC'));
$date1->add(new DateInterval('PT7776000S'));
echo $date1->format('c') . PHP_EOL;

打印2018-07-03T10:00:00+00:00

// Setting timezone as a param to createFromFormat
$date2 = DateTime::createFromFormat('Y-m-d H:i:s', '2018-04-04 12:00:00', new DateTimeZone('UTC'));
$date2->add(new DateInterval('PT7776000S')); 
echo $date2->format('c') . PHP_EOL;

打印2018-07-03T12:00:00+00:00

2 个答案:

答案 0 :(得分:2)

当您在没有时区信息的情况下实例化DateTime 时,日期将被解释为您的默认本地时区;当您然后set新时区时,日期会转换到该时区。即:

$date1 = DateTime::createFromFormat('Y-m-d H:i:s', '2018-04-04 12:00:00');
比如欧洲/柏林,

$date1是12:00:00。

$date1->setTimezone(new DateTimeZone('UTC'));

$date1现在是UTC的10:00:00。

当您使用时区信息实例化DateTime 时,日期将被解释为引用该时区中的时间,之后没有转换过程。即:

$date2 = DateTime::createFromFormat('Y-m-d H:i:s', '2018-04-04 12:00:00', new DateTimeZone('UTC'));

$date2是UTC的12:00:00。

答案 1 :(得分:1)

看起来您的第二个示例正确地将90天(7776000秒)添加到原始日期。

我认为发生的事情是,在第一个示例中,您根据当前时区(默认)设置时间,然后转换为UTC,然后添加秒。

在第一个示例中,您将时区设置为UTC并设置时间,然后添加时间间隔。

看看这个老问题的答案: Timezone conversion in php

编辑:刚看到@deceze已经回答过类似的问题。不过,请参阅链接以查看其他讨论/示例/等。