PHP date_default_timezone_set()东部标准时间(EST)

时间:2011-04-05 22:02:12

标签: php timezone dst

长话短说

是否存在PHP5在东部标准时间内识别的官方未弃用时区 - 而不是东部日光时间?

短篇小说:-P

哇,我无法相信PHP会因为设置时间而产生这样的群集。

我想使用PHP5的date_default_timezone_set()来设置我的脚本的时区。我想使用标准时间。我 希望我的脚本能够观察夏令时。我不想每次程序写入时都使用gmtime()并减去60 * 60 * 5秒。我也不想将该值保存到变量中。设置默认时区更加优雅,使脚本更易于移植到其他服务器和区域设置。

不幸的是,PHP要求我在设置默认时区时使用其中一个愚蠢的“官方时区”。有一个“America / New_York”,但我不知道它或任何官方PHP时区是否遵守夏令时。通过实验,我发现“America / New_York”确实观察到了DST。 “美国/巴拿马”是美国东部时间,因此没有观察到夏令时......但是,如果巴拿马未来应该改变他们对夏令时的看法呢? (他们在1908年观察到DST)

因为巴拿马总能改变主意;我只是想使用GMT或UTC偏移。

然后有这个......

http://us.php.net/manual/en/timezones.others.php

上面的链接列表我假设的是不推荐使用的时区。 “EST”在那里但是以美国为中心,所以我理解为什么它被弃用了。 “Ect / GMT-5”也在那里,我完全不知道为什么会被弃用。如果你问我,所有的地名时区应该被弃用,GMT时区也不推荐......但是得到这个......“Ect / GMT-5”实际上是错的!我不得不使用“Ect / GMT + 5”来获得美国的东部标准时间。我很确定我不会在东海岸的英格兰前5小时。

答复?

没有人真正回答这个问题。所以我想我会自己回答。 “不,PHP5认可的东部标准时间没有,没有弃用的时区”

很多人告诉我,我应该将日期存储为UTC时间,并将它们转换为当地时间,当我将它们从存储中取出时 - 我已经知道了。问题是,我被聘请只修复脚本的这一小部分,我怀疑这个人是否会让我重新编写他自PHP开始以来一直使用的整个代码。

我会不情愿地向那些向您展示如何正确存储和检索时间的老兄表示赞赏,以便未来的人们可以通过这种方式了解如何以正确的方式做到这一点。

5 个答案:

答案 0 :(得分:19)

你想要做的事情是不实际的,会导致你的用户讨厌你。

指定时区背后的完整原因是准确表示当地时间。当该局部区域在DST内时,将“标准”时间表示为本地时间是客观上不正确的。在该时区内读取时间的任何人都会被误导。

如果您需要存储和处理忽略时区的日期和时间,则使用UTC进行此目的,即存储和普通数学。值得记住的是,即使是好的旧Unix时间戳也是“1970年1月1日午夜, UTC ”。

如果您需要表示用户本地的时间,那么您应该允许他们选择他们的本地时区,并将其转换为 on display 。现代PHP的DateTime和DateTimeZone使这个死简单。从交互式提示中:

php > $utc = new DateTimeZone('UTC');
php > $amla = new DateTimeZone('America/Los_Angeles');
php >
php > $two_past_midnight = new DateTime('2011-04-05 00:02', $utc);
php > $two_past_midnight->setTimeZone($amla);
php > echo $two_past_midnight->format('Y-m-d H:i:s');
2011-04-04 17:02:00

没有混乱,没有大惊小怪。当我们切换时区时,它为我们完成了数学计算。


在替代方案中,如果您确实真的 想要展开DST时区,请结合getTransitions查看getOffsetthe various timezone date() formats,特别是I。您可以查看并生成结果信息,以查找下一个DST区域的“标准”版本何时转换并相应地进行调整。请记住,不同的区域在不同的时间过渡,并非所有区域都转换相同的数量......有些区域根本不会过渡。已经I think someone mentioned Indiana

通常我也会在这里提供示例代码,但是日期数学让我对暴力的永不满足的渴望。无论谁决定60,60,24,7,4-6,6和52是可以接受的思考时间和日期的方式,都是邪恶的,邪恶的人。值得庆幸的是,他们已经死了几百到几千年。

答案 1 :(得分:1)

America/New_York确实遵守DST并且是推荐的时区。 (我去年参加了一个会议,其中Derick Rethans撰写了很多日期/时间代码,并发言。)区域时区背后的想法是他们遵守他们所表示的城市/地区的时区规则(这就是为什么有7个印第安纳时区的原因。

答案 2 :(得分:1)

echo ' Format ' . date('m/d/Y H:i:s a') ;
<br/>//maketime function- mktime(hour,minute,second,month,day,year,is_dst)
<br/>$EasternTimeStamp =mktime(date('H')-6,date('i'),date('s'),date("m"),date("d"),date("Y"));
<br/>// date function- date(format, timestamp)
<br/>echo 'Format ' . date('m/d/Y H:i:s a',$EasternTimeStamp) ;

答案 3 :(得分:0)

您应始终使用UTC存储时间,这是time()返回的时间,然后根据服务器的位置设置时区,如果适用,将更新为DST。

答案 4 :(得分:0)

好吧,如果你真的想在UTC日期之前或之后X小时,我会这样做:

$now = gmdate('Y-m-d H:i:s', time() - 3600 * $hours);

在您的情况下,我认为$hours为5。

正如其他人所说,包括我自己,这不是一个好习惯......但你知道这一点。