PHP UTC 到当地时间
服务器环境
Redhat Enterprise Linux
PHP 5.3.5
问题
假设我有一个 UTC 日期和时间,例如 2011-04-27 02:45,我想 将其转换为我的当地时间,即美国/纽约。
三个问题:
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?
谢谢:-)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
这将使用 PHP 原生 DateTime 和 DateTimeZone 类:
参见 DateTime::createFromFormat man页面了解更多信息。
经过一些实验 目前有和没有 DST 的时区 我发现这会考虑 DST。使用我上面的方法进行相同的转换会产生相同的结果时间。
This will do what you want using PHPs native DateTime and DateTimeZone classes:
See DateTime::createFromFormat man page for more information.
After some experimentation between time zones that do and do not currently have DST I have discovered that this will take DST into account. The same conversion using my method above renders the same resulting time.
我知道这是一篇旧文章,但您需要添加另一行才能获得正确的时间。
在转换为本地时间之前,您需要将默认时区设置为 UTC,如下所示(如果它是您提供的时间的时区):
I know this is an old post, but there is another line you need to add to get the correct time.
Before converting to local time, you need to set the default time zone to UTC like this (if it is the time zone of the time you are providing):
执行此命令后,$utc_ts 包含本地时间。 PHP 自行处理 DST。
=H=
Just after this executing this, $utc_ts contains the local time. PHP handles the DST itself.
=H=
我将改进 Hasin Hayder 的答案
它应该输出
区别在于添加源时区。 strtotime() 也接受时区,你知道! :p
I'll improve on Hasin Hayder's answer
It should output
The difference is adding the source Timezone. strtotime() accepts timezone too you know! :p
我不喜欢更改默认时区的答案。根据我在夏令时变化的国家生活的经验,正确的方法是始终使用 UTC,然后在向用户显示时更改为当地时间。
这是我使用的,从一个时区到另一个时区(在本例中从 UTC 到欧洲/马德里)。
如果您需要日期之间的秒数操作,请使用 $newDateTime->getTimestamp(),例如:
I dislike the answers that changes default timezone. The right way based in my experience living in a country with summer time change is to work always in UTC and then, when showing to user, change to localtime.
This is the one that I use, from one timezone to another (In this example from UTC to Europe/Madrid).
if you need the seconds for operation between dates then use $newDateTime->getTimestamp(), For example: