0

我想将是否遵循 DST 的选项留给用户选择。我正在尝试 CST 和 CST6CDT 时区,但两者都给了我相同的结果。

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 的情况下获得时间戳?我在这里做错什么了吗?

4

2 回答 2

4

CST现在在 DST 中(除了我,在我们不观察 DST 的萨斯喀彻温省)。所以 CST 和 CDT 现在在技术上是同一时间。如果您在 11 月中旬 DST 切换发生后再次尝试此操作,您将获得不同的时间。

试试GMT-6吧,这将为您提供 cst 类型的时间,而不管 DST 是什么,因为 GMT 区域不依赖于 DST。

于 2013-10-16T14:27:18.130 回答
2

PHP 使用IANA 标准时区数据库。在此数据中,诸如"CST"和之类的值"CST6CDT"仅用于向后兼容 POSIX 时区。除非绝对必要,否则您不应使用它们。

此处的PHP 文档非常清楚地说明了这一点:

警告

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

您应该改为使用"America/Chicago"来表示美国中部时区。

您可以在时区标签 wiki中阅读有关 IANA 时区数据库的更多信息。

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

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

关于您的评论:

我想将是否遵循 DST 的选项留给用户选择。

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

于 2013-10-16T18:39:36.420 回答