PHP夏令时漏洞?
我刚刚遇到了一个奇怪的bug,它发生在太平洋时间运行的PHP中(可能还有其他的)。我有代码可以在给定一周的任意日期(UNIX时间戳)的情况下获取一周的第一天(星期日):PHP夏令时漏洞?,php,date,datetime,dst,Php,Date,Datetime,Dst,我刚刚遇到了一个奇怪的bug,它发生在太平洋时间运行的PHP中(可能还有其他的)。我有代码可以在给定一周的任意日期(UNIX时间戳)的情况下获取一周的第一天(星期日): $day = date('w', $date); $start_of_week = date('Y-m-d', $date - ($day * 60*60*24)); echo $start_of_week; 打印2014-03-08 这适用于我尝试过的每一个日期,除了2014年3月9日这一周,在美国这一周恰好是夏令时。对于这
$day = date('w', $date);
$start_of_week = date('Y-m-d', $date - ($day * 60*60*24));
echo $start_of_week;
打印2014-03-08
这适用于我尝试过的每一个日期,除了2014年3月9日这一周,在美国这一周恰好是夏令时。对于这些人来说,$start\u of_week
是“2014-03-08”,这是一个星期六
当我在时区设置为GMT的情况下运行此代码时,我得到了正确的输出('2014-03-09')
此外,当我在PST中将代码更改为以下内容时,我会得到正确的输出:
$day = date('w', $date);
$start_of_week = date('Y-m-d', strtotime("-$day day", $date));
echo $start_of_week;
打印2014-03-09
那么…WTF?为什么strotime(“-1天,$date)
和$date-60*60*24
之间存在差异?好像它在不同的时区之间跳跃
当您使用-1天时,它使用从$date开始的一天中的时间,并且只更改日期。当您使用-60*60*24时,它会将时钟向后滚动24小时。在DST改变的那一天,一天只有23个小时,所以它超出了一个小时
–Barmar Mar 19'14 22:11看看手册中的评论:很高兴知道,但这并不能解释为什么
-1天
和-60*60*24
会产生不同的结果,除非我遗漏了什么。是的,这很公平,我认为,如果你像对待-1day
那样将数字放入strotime函数,那么你最终会得到相同的结果,但我的直觉告诉我,这是因为你在硬编码时间。当你使用-1day
时,它使用$date
中的时间,只是更改日期。当您使用-60*60*24
时,它会将时钟向后滚动24小时。在DST改变的那一天,一天只有23个小时,所以它超出了一个小时。