我想留下选择是否遵循DST或用户的选择。我正在尝试使用CST和CST6CDT时区,但bothare给了我相同的结果。
php > $tz = new DateTimeZone('CST');
php >
php > $d = new DateTime('now', $tz);
php > print_r($d);
DateTime Object
(
[date] => 2013-10-16 08:34:53
[timezone_type] => 3
[timezone] => America/Chicago
)
php >
php > $tz = new DateTimeZone('CST6CDT');
php >
php > $d = new DateTime('now', $tz);
php > print_r($d);
DateTime Object
(
[date] => 2013-10-16 08:35:21
[timezone_type] => 3
[timezone] => CST6CDT
)
php >
有没有办法在没有DST的情况下获得时间戳?我在这里做错了吗?
答案 0 :(得分:4)
现在CST IS 在DST(除了我,在萨斯喀彻温省,我们没有观察到DST)。所以CST和CDT在技术上现在是同一时间。如果你在11月中旬再次尝试DST切换,你会得到不同的时间。
请尝试使用GMT-6
,这样可以获得cst类型的时间,无论DST如何,因为GMT区域不依赖于DST。
答案 1 :(得分:2)
PHP使用IANA standard time zone database。在此数据中,仅存在"CST"
和"CST6CDT"
等值,以便与POSIX时区向后兼容。除非绝对必要,否则不应使用它们。
警告强>
请不要使用此处列出的任何时区(除了UTC),它们仅出于向后兼容的原因而存在。
您应该使用"America/Chicago"
代表美国中部时区。
您可以在the timezone tag wiki中了解有关IANA时区数据库的更多信息。
“CST”对于时区标识符来说是错误选择的部分原因是时区缩写可能不明确。 “CST”可能代表“中央标准时间”,但可能是美国中部时间,或澳大利亚中部时间。它也可以代表“古巴标准时间”或“中国标准时间”。
即使您知道它在美国,“CST6CDT”也不是一个很好的标识符,因为它没有考虑到美国的DST规则在2007年发生了变化。
关于你的评论:
我想留下选择是否遵循DST或者用户的选择。
这是一种代码味道。每当您在网站上看到DST [是/否]的复选框时,这都是应用程序未正确使用时区的明确信号。当您的用户选择“America / Chicago”或“America / Los_Angeles”或“Europe / London”等时区时,时区数据库中的信息将已知道是否遵循DST以及何时。 DST在世界各地的许多不同时间开始和停止,因此必须正确使用数据库。