如何在PHP中获取DST独立时间戳

时间:2013-10-16 14:24:04

标签: php datetime timezone dst

我想留下选择是否遵循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的情况下获得时间戳?我在这里做错了吗?

2 个答案:

答案 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时区向后兼容。除非绝对必要,否则不应使用它们。

PHP documentation here非常清楚:

  

警告

     

请不要使用此处列出的任何时区(除了UTC),它们仅出于向后兼容的原因而存在。

您应该使用"America/Chicago"代表美国中部时区。

您可以在the timezone tag wiki中了解有关IANA时区数据库的更多信息。

“CST”对于时区标识符来说是错误选择的部分原因是时区缩写可能不明确。 “CST”可能代表“中央标准时间”,但可能是美国中部时间,或澳大利亚中部时间。它也可以代表“古巴标准时间”或“中国标准时间”。

即使您知道它在美国,“CST6CDT”也不是一个很好的标识符,因为它没有考虑到美国的DST规则在2007年发生了变化。

关于你的评论:

  

我想留下选择是否遵循DST或者用户的选择。

这是一种代码味道。每当您在网站上看到DST [是/否]的复选框时,这都是应用程序未正确使用时区的明确信号。当您的用户选择“America / Chicago”或“America / Los_Angeles”或“Europe / London”等时区时,时区数据库中的信息将已知道是否遵循DST以及何时。 DST在世界各地的许多不同时间开始和停止,因此必须正确使用数据库。