PHP UTC 到本地时间

Posted

技术标签:

【中文标题】PHP UTC 到本地时间【英文标题】:PHP UTC to Local Time 【发布时间】:2011-08-13 23:21:30 【问题描述】:

服务器环境

红帽企业 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.) 如果没有,我应该如何调整我的代码以自动调整夏令时?谢谢 :-)

【问题讨论】:

date("Z") 总是返回时区GMT +0000,它对 DST 没有更正。 【参考方案1】:

这将使用 PHP 原生 DateTime 和 DateTimeZone 类完成您想要的操作:

$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 之间进行了一些实验后,我发现这将考虑夏令时。使用我上面的方法进行相同的转换会呈现相同的结果时间。

【讨论】:

这也是为什么 PHP 为印第安纳州设置了 7 个不同的时区,以解释他们所有疯狂的不同 DST 规则:php.net/manual/en/timezones.php All:非常感谢大家的帮助。特雷弗农:谢谢!我会试一试。与您的代码相比,我的代码看起来很原始,哈哈。我什至接近我的尝试?再次感谢! @John 很高兴你喜欢它。我不确定你的代码,因为我从来没有用 PHP 程序风格那样写过。 @Treffynnon 引用星球大战:这是一个较旧的代码,但签出。【参考方案2】:

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

在转换为本地时间之前,您需要像这样将默认时区设置为 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");

【讨论】:

【参考方案3】:
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=

【讨论】:

这不会转换时区之间的时间。它只是为2011-04-27 02:45 创建一个新的unix 时间戳。在这种情况下,您示例中的时区没有任何作用,并且无关紧要。 没有像UTC时间戳这样的东西,因为时间戳不受时区的影响。您可以在第一行设置任何时区,$utc_ts 将返回相同的值。这段代码除了设置时区以供将来在脚本中使用之外什么都不做,它不会影响时间戳本身。【参考方案4】:

我会改进 Hasin 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

【讨论】:

【参考方案5】:
<?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;

?>

【讨论】:

请在您的 sn-p 中添加一些解释,以便它有用

以上是关于PHP UTC 到本地时间的主要内容,如果未能解决你的问题,请参考以下文章

php 重力特权// GP条件逻辑日期//将用户的本地时间调整为UTC

时刻 Js UTC 到本地时间

Python - 从 DST 调整的本地时间到 UTC

csharp UTC到本地时间转换

使用 WinAPI 进行夏令时和 UTC 到本地时间的转换

在观察夏令时的同时解析本地时间的有序时间戳(到 UTC)