【问题标题】:PHP Daylight savings bug?PHP夏令时错误?
【发布时间】: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 有区别?好像在不同时区之间跳跃。

codepad example

【问题讨论】:

  • 看看手册中的这条评论:php.net/strtotime#41328
  • 很高兴知道,但这并不能解释为什么 -1 day-60*60*24 会产生不同的结果,除非我遗漏了什么。
  • 是的,很公平,我认为如果您将数字放入 strtotime 函数中,就像使用 -1 day 一样,那么您最终会得到相同的结果,但我的直觉告诉我这是发生这种情况是因为您当时正在硬编码
  • 当您使用-1 day 时,它使用$date 中的时间,并且只是更改日期。当您使用 - 60 * 60 * 24 时,它会将时钟回滚 24 小时。夏令时改变的那天,一天只有 23 个小时,所以过了一个小时。

标签: php date datetime dst


【解决方案1】:

当您使用 -1 天时,它使用来自 $date 的时间,并且只是更改日期。当您使用 - 60 * 60 * 24 时,它会将时钟回滚 24 小时。夏令时改的那天,一天只有 23 个小时,多过了一个小时。

– Barmar 2014 年 3 月 19 日 22:11

【讨论】:

    猜你喜欢
    • 2020-03-21
    • 2017-08-16
    • 2018-10-04
    • 1970-01-01
    • 2011-12-18
    • 2014-12-30
    • 2012-11-25
    • 2016-08-06
    • 2017-08-28
    相关资源
    最近更新 更多