PHP UTC to Local Time
服务器环境
Redhat Enterprise Linux
PHP 5.3.5
问题
假设我有一个UTC日期和时间,例如2011-04-27 02:45,我想
将它转换为我当地时间,即America / New_York。
三个问题:
1.)我的代码可以解决问题,你同意吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?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.)如果没有,我应该如何调整我的代码以自动调整夏令时?
谢谢:-)
这将使用PHP本机DateTime和DateTimeZone类执行您想要的操作:
1 2 3 4 5 6 7 8 9 10 | $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手册页。
在经历过和当前没有DST的时区之间进行一些实验后,我发现这将考虑DST。使用上述方法进行的相同转换会产生相同的结果时间。
我知道这是一个旧帖子,但是还需要添加另一行来获取正确的时间。
在转换为本地时间之前,您需要将默认时区设置为UTC(如果它是您提供时间的时区):
1 2 3 4 5 6 | 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"); } |
我会改进Has??in Hayder的答案
1 2 3 | 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); |
它应该输出
1 | 2011-04-26 10:45:00 pm EDT |
不同之处在于添加源时区。 strtotime()也接受你知道的时区! :p
1 2 | 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 =