关于时区:PHP date_default_timezone_set()东部标准时间(EST)

PHP date_default_timezone_set() Eastern Standard Time (EST)

长话短说

是否存在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开始以来一直在使用的整个代码。

我会不情愿地向那些向您展示如何正确存储和检索时间的家伙表示赞赏,以便将来寻找这个的人学习如何以正确的方式做到这一点。


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

命名时区背后的全部原因是准确地表示当地时间。将"标准"时间表示为本地区域在DST内的本地时间是客观上不正确的。在该时区内读取时间的任何人都会被误导。

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

如果您需要表示用户本地的时间,那么您应该允许他们选择他们的本地时区,并在显示时进行转换。现代PHP的DateTime和DateTimeZone使这简单。从交互式提示:

1
2
3
4
5
6
7
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时区,请结合getTransitionsgetOffset以及各种时区date()格式,特别是I。您可以查看并生成结果信息,以查找下一个DST区域的"标准"版本何时转换并相应地进行调整。请记住,不同的区域在不同的时间过渡,并非所有区域都转换相同的数量......有些区域根本不会过渡。我觉得有人提到过印第安纳州。

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


1
2
3
4
5
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) ;


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


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

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

在你的情况下,$hours将是5,我想。

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


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