2013-03-31 250 views
1

开始学习有关php dateTime & dateTimezone对象。假设美国/东部的服务器在另一个时区创建一个时间,目标是在服务器时间内将时间(即伦敦)转换并存储在服务器上(美国/东部)。使用此代码:如何计算正确的偏移量?

$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总是在今天之前或之后(今天早些时候欧洲转换为DST)返回。在啊哈的时刻,我发现getOffset的说明文件为Returns the timezone offset from GMT

有没有简单的方法将时间转换为US/Eastern?我是否必须进入getTransitions,查找DST开始的日期并手动进行计算?这只在每个春季/秋季开关的第一天就很重要。

+2

你总是想成为无知服务器的时区。从UTC时间开始,然后转换为目标时区。我不是PHP开发人员,所以我不能提供编码解决方案,但这是一般时区的最佳实践。 –

+0

@MattJohnson伟大的想法开始W/UTC和转换。这在很大程度上是个问题...... – David

回答

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