【问题标题】:How to get absolute date difference between two dates in PHP?如何在 PHP 中获取两个日期之间的绝对日期差?
【发布时间】:2011-10-21 19:10:19
【问题描述】:

我看到这个问题还有其他语言的其他帖子,但我找不到 PHP 的帖子。我不是在寻找两个日期时间之间的差异,而是在寻找不同的天数。例如:

2011-08-06 14:05:28

2011-08-07 08:46:28

相隔不到一天,但我想要一个函数来告诉我他们在相隔一天的日子里,即这两个日期将返回 1 的值,并返回 @987654325 的值@ 表示以下日期,例如:

2011-08-06 23:05:28

2011-08-08 01:46:28

说真的,我猜这一定很简单,但我以前没怎么处理过约会。

哦,还有一个限制,我需要与 PHP 5.2 兼容的东西,所以不能使用DateTime::diff

编辑:更改以澄清我确实需要一个数字返回值,抱歉:)

【问题讨论】:

  • 不确定...我不需要几个月或几年,只需要天数,因此选择了答案(而不是 2 年、3 个月、2 天,我想要 795 之类的东西)

标签: php date php-5.2


【解决方案1】:

如果我正确解释了这个问题,你需要GregorianToJD 或mysql to_days

这两个函数都返回一个特定日期的julian day,这基本上是从“第 0 天”开始的天数。

【讨论】:

  • 是的,to_days 看起来不错...我不确定另一个,我不清楚它会返回什么值...
  • 嘿,如果这可行,这听起来是一个简单的解决方案...我会尝试并回复您。
【解决方案2】:
$date1 = "2011-08-06 14:05:28";
$date2 = "2011-08-07 08:46:28";
if(date('Ymd', strtotime($date1)) == date('Ymd', strtotime($date2)))
{
    // Same day!
}

更新

如果你真的想要日期之间的天数,我建议你更新到 PHP 5.3。计算天数可能相当困难,特别是如果您希望能够处理不同年份的天数。

$days = abs(date('z', strtotime($date1)) - date('z', strtotime($date2)));

这是我能做的最好的了,但它要求$date1$date2 在同一年。

【讨论】:

    【解决方案3】:
    $secondsApart = strtotime( '2011-08-07 08:46:28' ) -
                       strtotime( '2011-08-06 14:05:28' );
    

    现在您可以基于此计算任何其他值:

    $hoursApart = round( $secondsApart / 3600 );
    $daysApart = round( $secondsApart / 86400 );
    ...
    

    如果更适合您的需要,您也可以使用 floor() 或 ceil() 代替 round()。

    【讨论】:

      【解决方案4】:
      1. 将日期转换为时间戳。具体如何完成取决于输入数据的格式。
      2. 使用 PHP 的 date 函数格式化时间戳(Ymd 似乎是一个合适的 $format)。
      3. 比较结果字符串是否相等。

      如果您需要实际的天数差异,请分别调用date,使用Ymd 作为格式,从结果构造时间戳(使用mktime)并除以时间戳之间的差异86400(每天的秒数)。

      【讨论】:

        【解决方案5】:
          $date1 = "2011-08-06 14:05:28";
          $date2 = "2011-08-07 08:46:28";
          if(date("Ymd",strtotime($date1)) == date("Ymd",strtotime($date2)) {
              // they match
        
          } else {
              // calculate the difference
              $diff = ceil(abs(strtotime($date1)-strtotime($date2))/86400); 
        
          }
        

        【讨论】:

        • 同上评论...我真的很想得到一个数字答案。
        • 这将返回不同月份同一天的错误答案,即2011-08-152011-09-15
        【解决方案6】:

        我会尝试这样的事情(主要使用时间戳):

        /**
         * @param string $date1
         * @param string $date2
         * @return int
         *   Number of days between the two dates.
         */
        function date_diff_days($date1, $date2) {
        
            // Ignore the time part and convert the date part to timestamp.
            $date1 = substr($date1, 0, 10);
            $date1 = strtotime($date1 . ' 00:00:00');
            $date2 = substr($date2, 0, 10);
            $date2 = strtotime($date2 . ' 00:00:00');
        
            // Compute the difference in seconds.
            $diff_secs = abs($date1 - $date2);
        
            // Convert the difference to days.
            $diff_days = ceil($diff_secs / (60 * 60 * 24));
        
            return $diff_days;
        
        }
        

        我在您的两个测试用例中都进行了尝试,结果完全符合您的要求。如果您想要任何更改,您可以编辑该功能。希望对您有所帮助!

        【讨论】:

          猜你喜欢
          • 2016-05-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-22
          • 2017-03-27
          • 1970-01-01
          相关资源
          最近更新 更多