Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP夏令时漏洞?_Php_Date_Datetime_Dst - Fatal编程技术网

PHP夏令时漏洞?

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日这一周,在美国这一周恰好是夏令时。对于这

我刚刚遇到了一个奇怪的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日这一周,在美国这一周恰好是夏令时。对于这些人来说,
$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个小时,所以它超出了一个小时。