【问题标题】:How to subtract two dates, ignoring daylight savings time in PHP?如何减去两个日期,忽略 PHP 中的夏令时?
【发布时间】:2010-10-22 17:15:20
【问题描述】:

我正在尝试计算两天之间的天数,但遇到了夏令时问题。这是我的代码:

function date_diff($old_date, $new_date) {
    $offset = strtotime($new_date) - strtotime($old_date);
    return $offset/60/60/24;
}

只要这几天都在同一 DST 期间,就可以正常工作:

echo date_diff('3/15/09', '3/18/09'); // 3

但如果他们相距较远,则不会:

echo date_diff('11/15/08', '3/18/09'); // 122.95833333333

我想要偶数天,不关心 DST。我想我可以对结果进行四舍五入,但这感觉很笨拙。有没有更好(简单)的方法?如果可以避免的话,我不想写一整天的解析和计算避免闰年的事情。

(注意:这必须在php 5.1.6下运行,所以5.3中的一些日期功能可能不可用。)

更多信息:我将获取偏移量并将其添加到数据库中的其他日期时间,并且我只想更改日期部分,而不是时间部分。无论如何,四舍五入是行不通的,因为当我进行添加时,它会在另一个方向下降一小时。也许有一个更好的方法来解决整个问题......

【问题讨论】:

    标签: php datetime dst


    【解决方案1】:

    您可以使用http://ca3.php.net/date_default_timezone_set 将时区设置为格林威治标准时间,这样就不会有偏移。

    或者,您可以使用date('I',$timetamp) 手动添加偏移量

    if ( date("I") == 1 ) {      // "WE ARE MDT";  
            $timeZone = "MDT";  
    } else {  
            $timeZone = "MST";  
    }  
    

    【讨论】:

    • 在我所有的日期数学似乎工作之前添加这个:date_default_timezone_set('UTC');
    • 使用 date_default_timezone_set('UTC');是一个很好的方法。请注意,如果您需要页面上的其他日期,可能会导致其他日期的准确性产生副作用。如果您的页面上没有其他日期,请忽略此评论。 :-)
    【解决方案2】:

    您可以使用floor()ceil() 在特定方向强制舍入。

    【讨论】:

      【解决方案3】:

      强制日期进入没有夏令时,GMT/UTC 的时区:

      function date_diff($old_date, $new_date) {
        $offset = strtotime($new_date . " UTC") - strtotime($old_date . " UTC");
        return $offset/60/60/24;
      }
      
      echo date_diff('3/15/09', '3/18/09'); // 3
      echo date_diff('11/15/08', '3/18/09'); // 123
      

      【讨论】:

      • 这行得通,但有些人可以解释它是如何工作的,无法理解你从哪里得到 /60/60/24...
      【解决方案4】:

      我尝试了上面的“UTC”代码。没有为我工作。我仍然得到十进制值。

      当日期范围内有夏时制日期时,差值序列小数部分将小于 0.5 或大于 0.5。当日期范围有夏令时 3/15 时,十进制值 > .5 当日光关闭时,日期十进制

      【讨论】:

        猜你喜欢
        • 2020-04-26
        • 2014-04-30
        • 1970-01-01
        • 2015-10-24
        • 2013-09-03
        • 2015-01-03
        • 1970-01-01
        • 2013-01-12
        相关资源
        最近更新 更多