您不能使用strtotime
,因为它会创建一个 UTC 时间戳,这会删除时区信息。相反,只需使用DateTime
$date = new DateTime('30-Mar-2013 America/Los_Angeles');
echo $date->format('I');
# 1
$date = new DateTime('31-Mar-2013 America/Los_Angeles');
echo $date->format('I');
# 1
$date = new DateTime('09-Mar-2013 America/Los_Angeles');
echo $date->format('I');
# 0
$date = new DateTime('10-Mar-2013 America/Los_Angeles');
echo $date->format('I');
# 0
请注意,最后一个 DST 仍然为 0?这是因为转换发生在凌晨 2:00:
$date = new DateTime('10-Mar-2013 01:00 America/Los_Angeles');
echo $date->format('I');
# 0
$date = new DateTime('10-Mar-2013 02:00 America/Los_Angeles');
echo $date->format('I');
# 1
这是一个“弹簧向前”过渡,时钟从 2:00 跳到 3:00。
注意后备转换期间的歧义,时钟从 2:00 跳回 1:00
$date = new DateTime('3-Nov-2013 01:00 America/Los_Angeles');
echo $date->format('I');
# 1
有两个 1:00 AM,这是第一个。这是模棱两可的,因为我们可能指的是第二个,而那没有被表示出来。
有人会认为 PHP 将允许以下任一项:
new DateTime('3-Nov-2013 01:00 -0700 America/Los_Angeles') #PDT
new DateTime('3-Nov-2013 01:00 -0800 America/Los_Angeles') #PST
但是当我测试时,这些似乎不起作用。我还尝试了 ISO 格式日期。任何人都知道如何正确区分 PHP 中的模棱两可的值?如果是这样,请在评论中编辑或更新。谢谢。