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 到本地时间的主要内容,如果未能解决你的问题,请参考以下文章