长话短说
PHP5 是否有一个官方的、未弃用的时区,它可以识别东部标准时间——而不是东部夏令时?
长话短说:-P
哇,我简直不敢相信 PHP 会因为设置时间而产生这样的集群。
我想使用 PHP5 的 date_default_timezone_set() 为我的脚本设置时区。我想使用 标准 时间。我 不 希望我的脚本遵守夏令时。我不想每次我的程序写一次时都必须使用 gmtime() 并减去 60*60*5 秒。我也不想将该值保存到变量中。设置默认时区更优雅,并使脚本更易于移植到其他服务器和语言环境。
不幸的是,PHP 要求我在设置默认时区时使用他们愚蠢的“官方时区”之一。有一个“America/New_York”,但我不知道它或任何官方 PHP 时区是否遵守夏令时。通过实验,我发现“America/New_York”确实遵守了夏令时。 “美国/巴拿马”是美国东部标准时间,因此不遵守夏令时……但如果巴拿马将来改变对夏令时的看法怎么办? (他们在 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 诞生以来一直在使用的整个代码。
我不情愿地感谢向您展示如何正确存储和检索时间的家伙,以便 future 搜索此内容的人学习如何以正确的方式执行此操作。
最佳答案
你想做的事情不切实际,会导致你的用户讨厌你。
命名时区背后的全部原因是为了准确表示本地时间。当本地区域在夏令时内时,将“标准”时间表示为本地时间在客观上是不正确的。在该时区内读取时间的任何人都会被误导。
如果您需要存储和使用忽略时区的日期和时间,那么为此目的使用 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
没有困惑,没有大惊小怪。当我们切换时区时,它为我们处理了数学问题。
或者,如果您真的,真的,真的想要拉平夏令时时区,请查看
getTransitions
和 getOffset
与 the various timezone date()
formats ,特别是 0x2518122413 的组合。您可以查看结果信息,以查找任何 DST 区域的“标准”版本下一次转换的时间并相应地进行调整。请记住,不同的区域在不同的时间过渡,并且并非所有区域的过渡量都相同……有些根本不会过渡。 I think someone mentioned Indiana 已经。通常我也会在这里提供示例代码,但日期数学让我对暴力充满了永不满足的渴望。谁认为 60、60、24、7、4-6、12 和 52 是可以接受的思考时间和日期的方式是邪恶的,邪恶的人。谢天谢地,他们都已经死了几百到几千年。
关于PHP date_default_timezone_set() 东部标准时间 (EST),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5559103/