PHP - 使用日期查找夏令时

时间:2013-04-29 21:02:29

标签: php date strtotime

我想给date()一个日期,如果该日期是DST,则让它返回。在Windows 7机器上通过xampp运行PHP 5.4.7。无论我提供什么日期,运行PHP 5.2.8的linux框都会返回0。

我的代码出了什么问题?

echo date('I', strtotime('30-Mar-2013'));
# should return a 1 but returns 0

echo date('I', strtotime('30-Mar-2013 America/Los_Angeles'))."<br>"; # returns 0
echo date('I', strtotime('31-Mar-2013 America/Los_Angeles'))."<br>"; # returns 1

DST之间的转换应在2013年3月9日至2013年3月10日之间。

此时,问题是,为什么我的PHP代码不返回1.

2 个答案:

答案 0 :(得分:9)

您无法使用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点:

$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点,这是第一个。它含糊不清,因为我们可能意味着第二个,而且没有代表。

有人会认为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中的歧义值?如果是,请在评论中进行编辑或更新。感谢。

答案 1 :(得分:0)

请注意回退过渡期间的模糊性,其中时钟从2:00跳回到1:00 $date = new DateTime('3-Nov-2013 02:01 America/Los_Angeles');

echo $date->format('I');

0

有两个1:00 AM,2:01是第二个o&#39;时钟再加上1小时1分钟。