PHP UTC到当地时间

问题描述:

服务器环境PHP UTC到当地时间

红帽企业Linux
PHP 5.3.5

问题

比方说,我有一个UTC日期和时间,例如2011-04 -27 02:45我想 将它转换为当地时间,即America/New_York。

三个问题:

1)我下面的代码可能会解决这个问题,你会同意吗?

<?php 

date_default_timezone_set('America/New_York'); // Set timezone. 

$utc_ts = strtotime("2011-04-27 02:45"); // UTC Unix timestamp. 

// Timezone offset in seconds. The offset for timezones west of UTC is always negative, 
// and for those east of UTC is always positive. 
$offset = date("Z"); 

$local_ts = $utc_ts + $offset; // Local Unix timestamp. Add because $offset is negative. 

$local_time = date("Y-m-d g:i A", $local_ts); // Local time as yyyy-mm-dd h:m am/pm. 

echo $local_time; // 2011-04-26 10:45 PM 

?> 

2.)但是,$ offset的值会自动调整为夏令时(DST)吗?
3.)如果不是,我应该如何调整我的代码以自动调整DST?

谢谢:-)

+2

你试过了吗? – wallyk 2011-04-27 15:26:14

+0

'date(“Z”)'总是返回时区'GMT + 0000',它没有DST修正。 – 2011-04-27 15:37:12

这会做你想要使用PHP的原生DateTimeDateTimeZone类的内容:

$utc_date = DateTime::createFromFormat(
       'Y-m-d G:i', 
       '2011-04-27 02:45', 
       new DateTimeZone('UTC') 
); 

$nyc_date = $utc_date; 
$nyc_date->setTimeZone(new DateTimeZone('America/New_York')); 

echo $nyc_date->format('Y-m-d g:i A'); // output: 2011-04-26 10:45 PM 

更多信息请参见DateTime::createFromFormat man page

经过time zones that do and do not currently have DST之间的一些实验后,我发现这将考虑到DST。使用上述方法进行的相同转换会导致相同的结果时间。

+1

这也是为什么PHP有7个不同的时区用于印第安纳州,以说明他们所有疯狂的不同DST规则:http://php.net/manual/en/timezones.php – 2011-04-27 16:28:16

+0

All:我真的很感谢大家的帮助。 Treffynnon:谢谢!我会试一试。我的代码看起来很原始,与你相比,哈哈。我的尝试是否接近?再次感谢! – John 2011-04-27 16:35:00

+0

@John很高兴你喜欢它。我不确定你的代码,因为我从来没有用程序化的PHP风格这样写过代码。 – Treffynnon 2011-04-27 16:39:32

date_default_timezone_set('America/New_York'); // Set timezone. 
$utc_ts = strtotime("2011-04-27 02:45"); // UTC Unix timestamp. 

就在执行此之后,$ utc_ts包含本地时间。 PHP处理DST本身。

= H =

+1

这不会转换时区之间的时间。它只是为'2011-04-27 02:45'创建一个新的unix时间戳。你的例子中的时区在这种情况下什么也不做,并且是无关紧要的。 – Treffynnon 2011-04-27 15:56:44

+2

没有像UTC时间戳这样的事情,因为时间戳不受时区影响。您可以在第一行设置任何时区,$ utc_ts将返回相同的值。此代码除了设置时区以供将来在脚本中使用外,不会影响时间戳本身。 – Wh1T3h4Ck5 2011-04-27 17:06:18

我知道这是一个旧帖子,但是您需要添加另一行以获得正确的时间。

之前转换为本地时间,您需要将默认时区设置为UTC这样的(如果是您所提供的时间的时区):我会提高HASIN

function GmtTimeToLocalTime($time) { 
    date_default_timezone_set('UTC'); 
    $new_date = new DateTime($time); 
    $new_date->setTimeZone(new DateTimeZone('America/New_York')); 
    return $new_date->format("Y-m-d h:i:s"); 
} 

Hayder的回答

date_default_timezone_set('America/New_York'); // Set timezone. 
$utc_ts = strtotime("2011-04-27 02:45 UTC"); // UTC Unix timestamp. 
echo date('Y-m-d H:i:s a T', $utc_ts); 

应该输出

2011-04-26 10:45:00 pm EDT 

的区别是加入的S我们的时区。 strtotime()也接受时区你知道! :p