PHP UTC到当地时间

时间:2011-04-27 15:23:03

标签: php utc dst

服务器环境

Redhat Enterprise 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.)如果没有,我应该如何调整我的代码以自动调整夏令时?

谢谢你: - )

5 个答案:

答案 0 :(得分:35)

这将使用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 :(得分:3)

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

在转换为本地时间之前,您需要将默认时区设置为UTC(如果它是您提供时间的时区):

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");
}

答案 2 :(得分:0)

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 =

答案 3 :(得分:0)

我会改进Has​​in 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

不同之处在于添加了源时区。 strtotime()也接受你知道的时区! :P

答案 4 :(得分:0)

<?php
    $time = new DateTime('now', new DateTimeZone(date_default_timezone_get()));
    $timeZone = $time->format('P');//Asia/Kolkata ... GET TimeZone From PHP ini Setting
    $tm_datetime = '08/08/2021 12:00 AM';
    $tm_tz_from = $timeZone;
    $tm_tz_to = 'UTC';
    $tm_format = 'Ymd\THis\Z';
    $dt = new DateTime($tm_datetime, new DateTimeZone($tm_tz_from));
    $dt->setTimeZone(new DateTimeZone($tm_tz_to));
    $utc_time_from =$dt->format("H:i:s");
    echo "UTC TIME".$utc_time_from;

?>