PHP日期默认时区设置函数date_default_timezone_set()——东部标准时间(EST)

13

长话短说

PHP5是否有一个官方的、未被弃用的时区可以识别东部标准时间,而不是东部夏令时间?

详细说明 :-P

哇,我无法相信PHP在设置时间方面会出现这样的混乱。

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

不幸的是,当设置默认时区时,PHP要求我使用他们愚蠢的“官方时区”之一。虽然有一个“America/New_York”,但我不知道它或任何官方PHP时区是否遵循夏令时。通过实验,我发现“America/New_York”确实遵守夏令时。而“America/Panama”是EST,因此不遵守夏令时...但如果巴拿马将来改变了对夏令时的看法怎么办?(他们在1908年遵守夏令时)

因为巴拿马可能随时改变主意,所以我只想使用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诞生以来。

我将不情愿地给予这位向你展示如何正确存储和检索时间的家伙赞誉,以便未来搜索此内容的人学习如何以正确的方式执行此操作。


有时候你只能采用一些不应该使用的东西。我建议使用“US/Eastern”,但我不知道它是否包括夏令时。UTC/Etc肯定不会。 - Marc B
强制使用EST的目的是什么?也许有更好的方法来解决这个问题。 - Matthew
必须使用东部标准时间。我无法访问脚本的其余部分。作为承包商,我继承了某人在php5中犯下的旧php4错误。 - mrbinky3000
5个回答

19
你想做的事情是不切实际的,会导致用户讨厌你。
命名时区的整个目的是准确表示“当地时间”。在夏令时期间,将“标准”时间表示为“当地时间”是客观上的错误。任何在该时区内读取时间的人都会被误导。
如果您需要存储和处理忽略时区的日期和时间,请使用UTC进行存储和常规计算。值得记住,即使是古老的Unix时间戳也是“1970年1月1日午夜以来的秒数,UTC”。
如果您需要表示用户当地时间,请允许他们选择自己的当地时区,并在显示时进行转换。现代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

不添乱,不麻烦。当我们切换时区时,它为我们处理了数学计算。
在另一种情况下,如果你真的、真的、真的想要消除夏令时时区的差异,可以结合使用getTransitionsgetOffset,以及各种时区的date()格式,尤其是I。你可以查看获取到的信息,找出任何夏令时区的“标准”版本下一次转换的时间,并相应地进行调整。请记住,不同地区的转换时间不同,而且并非所有地区都会进行转换,有些地区根本不会转换。我记得有人提到过印第安纳州
通常我会在这里提供示例代码,但日期计算让我充满了对暴力的渴望。那些决定将60、60、24、7、4-6、12和52作为时间和日期的可接受方式的人是邪恶的、邪恶的人。幸运的是,他们都已经死了几百到几千年了。

+1 因为能够用代码展示我试图用英语解释的内容 - Adam Hopkinson
我完全同意你的观点。我总是将时间存储为UTC并转换为本地时间。然而,我正在为客户编写脚本的一部分,没有访问其余部分的网站。他们决定使用EST(不遵守夏令时)来存储所有时间。因此,当我发现将默认时区设置为东部标准时间如此困难时,我感到惊讶。就像它从PHP地图上被抹去了一样。我猜美国没有任何地方遵守GMT-5(EST)时间了。非常感谢。 - mrbinky3000
他们是如何绕过自动将“标准时间”转换为“日光节约时间”的?使用不同的技术栈吗?还是使用史前时代的PHP?如果你被困在这个问题上,考虑回退到使用传统的Unix时间戳,而不是使用现代的DateTime系统。如果你能让PHP认为它正在运行在UTC时区,那么你只需要手动从中减去5个小时就可以了,这并不会太麻烦。 - Charles
他们并不是邪恶的人,只是对于古代人(比如发明现代时间系统的苏美尔人)来说,在12进制下进行数学运算更为基本和简单。 - rvighne
啊,但问题不在于12,而在于7和4-6以及29-31等所有其他非标准的、不均匀可分的垃圾... - Charles

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) ;

1

America/New_York 观察夏令时并且是推荐的时区。(我去年参加了一个会议,Derick Rethans 在那里演讲了很多日期/时间代码。)地区时区背后的想法是它们遵守所表示的城市/地区的时区规则(这就是为什么有像印第安纳州7个时区的原因)。


我不想要夏令时,我想要标准时间。 :-( - mrbinky3000
抱歉,我误读了你问题的那一部分。如果你不想使用已弃用的时区,我建议使用协调世界时(UTC)并手动添加你想要的偏移量。有什么原因让你想避免夏令时吗?我有没有漏掉什么? - Jimmy Sawczuk

0

在编程中,你应该始终使用协调世界时(UTC)来存储时间,这也是time()函数返回的值。然后根据服务器所在的地理位置设置时区,如果适用的话,会自动更新夏令时。


1
time()并没有真正使用UTC。 它只是自一个固定时间点以来的秒数计数(这确实基于UTC)。 但我同意,通过 gmdate()time() 存储日期通常是最好的方法。 - Matthew
我同意。时间应该只以UTC格式存储。但是我只是一个小工蜂正在更新别人的脚本,没有权限更新整个网站。因此,我希望将时间写为EST而不是EDT。不过还是谢谢你。 - mrbinky3000

0

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

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

在你的情况下,$hours 应该是 5。
正如其他人所建议的,包括我自己,这不是一个好的做法...但你已经意识到了。

也许这就是你说你不想做的事情。你使用了 gmtime,也许你想用 gmdate。无论如何,如果你想确保脚本以这种方式工作,这就是我会使用的方法。将其封装到一个名为 standard_date() 的函数中,该函数从配置文件中读取 $hours - Matthew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接