【发布时间】:2014-04-26 11:29:32
【问题描述】:
我刚刚遇到了一个奇怪的错误,该错误发生在太平洋时间(可能还有其他时间)运行的 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_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?为什么strtotime("-1 day", $date) 和$date - 60*60*24 有区别?好像在不同时区之间跳跃。
【问题讨论】:
-
看看手册中的这条评论:php.net/strtotime#41328
-
很高兴知道,但这并不能解释为什么
-1 day和-60*60*24会产生不同的结果,除非我遗漏了什么。 -
是的,很公平,我认为如果您将数字放入 strtotime 函数中,就像使用
-1 day一样,那么您最终会得到相同的结果,但我的直觉告诉我这是发生这种情况是因为您当时正在硬编码 -
当您使用
-1 day时,它使用$date中的时间,并且只是更改日期。当您使用- 60 * 60 * 24时,它会将时钟回滚 24 小时。夏令时改变的那天,一天只有 23 个小时,所以过了一个小时。