如何计算正确的偏移量?

时间:2013-03-31 15:42:57

标签: php datetime timezone

开始了解php dateTime& dateTimezone对象。假设美国/东部的服务器并在另一个时区创建时间,目标是在服务器时间内转换并存储服务器(US / Eastern)上的时间(即伦敦)。使用此代码:

$runTime = '2013-04-10 07:45:00';
$serverTimezone = new DateTimeZone ( 'US/Eastern');
$checkinTimezone = new DateTimeZone ( 'Europe/London');
$checkinTime = new DateTime ( $runTime, $serverTimezone );

$offset = $serverTimezone -> getOffset ( $checkinTime );

echo "<br/><pre>";
echo 'London: ' . date ( 'Y-m-d H:i', $checkinTime -> format ( 'U' ) ) . "<br/>";
echo "<br/>offset: " . $offset . "<br/>";
echo 'Local: ' . date ( 'Y-m-d H:i', $checkinTime -> format ( 'U' ) + $offset );

-14400总是在今天之前或之后返回(欧洲今天早些时候转为夏令时)。在 aha时刻中,我发现getOffset的文档说Returns the timezone offset from GMT

有没有简单的方法将时间转换为美国/东方?我是否必须进入getTransitions,找到DST开始的那一天并手动进行计算?这仅适用于每个弹簧/秋季开关的第一天。

1 个答案:

答案 0 :(得分:0)

$fromZone = new DateTimeZone('US/Eastern');
$toZone = new DateTimeZone('UTC'); // assuming the server is going to be UTC going forwards

$dt = new DateTime('2013-04-02 10:00:00', $fromZone);
$dt->setTimezone($toZone);
echo $dt->format('Y-m-d H:i:s');

输出:2013-04-02 14:00:00

根据需要切换时区。


如果您只处理时间戳,可以稍微简化一下:

$fromZone = new DateTimeZone('US/Eastern');
$dt = new DateTime('2013-04-02 10:00:00', $fromZone);
echo $dt->getTimestamp();

输出:1364911200