【问题标题】:How to express the difference between two dates in a human-readable format如何以人类可读的格式表达两个日期之间的差异
【发布时间】:2011-09-26 10:35:56
【问题描述】:

如果我有两个日期 - $end_date$start_date,如何以“2 年:4 个月:2 天”等格式表示两者之间的差异?

我知道我可以像这样得到两个日期之间的差异:

$dif=strtotime($end_date)-strtotime($today);

但是我怎样才能将该结果转换为人类可读的格式,如上所示?

【问题讨论】:

标签: php


【解决方案1】:

这是格式化时间戳的方法:

echo date('d-m-Y', strtotime($end_date)) // for DD-MM-YYYY format

您是否要计算 2 个日期之间的差异(以天为单位)?

编辑:用于查找“XXyear YYmonth ZZday”中日期之间差异的代码。该代码假定开始日期和结束日期采用 YYYY-MM-DD 格式。如果您不是这种情况,请将它们更改为 YYYY-MM-DD 格式,或者相应地将参数更改为 mktime()。

$endDate = '2011-03-01';
$startDate = '2011-02-02';
$daysPerYear = 365;
$daysPerMonth = 30.4;
$diffDay = $diffMonth = $diffYear = 0;

$endDateTs = mktime(0, 0, 0, substr($endDate, 5, 2), substr($endDate, 8, 2), substr($endDate, 0, 4));
$startDateTs = mktime(0, 0, 0, substr($startDate, 5, 2), substr($startDate, 8, 2), substr($startDate, 0, 4));
$diffDay = ($endDateTs - $startDateTs) / 60 / 60/ 24;   // difference between 2 dates in number of days
$diffYear = floor($diffDay / $daysPerYear); // difference in years
$diffDay = $diffDay % $daysPerYear; // balance days
$diffMonth = floor($diffDay / $daysPerMonth);   // difference in months
$diffDay = ceil($diffDay % $daysPerMonth); // balance days
echo ($diffYear ? $diffYear . 'year ' : '') . ($diffMonth ? $diffMonth . 'month ' : '') . ($diffDay ? $diffDay . 'day' : '');

注意:我没有测试所有可能的日期组合的代码,包括闰年等。请随时根据需要进行调整。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    如果粗略的差异就足够了(“2 年前”),那么您可能想尝试Date_HumanDiff PEAR 包。

    【讨论】:

      【解决方案3】:
      function is_leap_year($year)
      {
          if($year % 4 == 0)
          {
              if($year % 100 == 0)
              {
                  if($year % 400 == 0)
                  {
                      return true;
                  }
                  else 
                  {
                      return false;
                  }
              }
              else
              {
                  return true;
              }
          }
          else 
          {
              return false;
          }
      }
      
      function calculate_date($now, $end){
          $years = date('Y', strtotime($end)) - date('Y', strtotime($now)) ;
          if($years < 0)
          {
              return "Error: year";
          }
          $mounths = date('m', strtotime($end)) - date('m', strtotime($now)) ;
          if($mounths < 0)
          {
              if($years < 1)
              {
                  return "Error: mounth and year";
              }
              else 
              {
                  $years --;
                  $mounths += 12;
              }
          }
          $days = date('d', strtotime($end)) - date('d', strtotime($now)) ;
          if($days < 0){
              if($mounths < 1)
              {
                  if($years < 1)
                  {
                      return "Error: day, mounth and year";
                  }
                  else 
                  {
                      $years --;
                      $mounths += 12;
                  }
              }
              else 
              {
                  $mounths --;
                  switch (date('m', strtotime($now)))
                  {
                      case 1:
                      case 3:
                      case 5:
                      case 7:
                      case 8:
                      case 10:
                      case 12:
                          $days +=31;
                          break;
                      case 4:
                      case 6:
                      case 9:
                      case 11:
                          $days +=30;
                          break;
                      case 2:
                          if(is_leap_year(date('Y', strtotime($now))))
                          {
                              $days += 29;
                              break;
                          }
                          else
                          {
                              $days += 28;
                              break;
                          }
                  }
              }
          }
          return  $years . " Years : " . $mounths . " Months : " . $days . " Days Remaining.";
      }
      
      $end_date = new DateTime('2011-08-05');
      $end_date = $end_date->format('d-m-Y');
      $today = date('d-m-Y');
      
      $remaining = calculate_date($today, $end_date);
      
      echo $remaining;
      

      如果你想格式化 end_date,你可以使用: 日期('d-m-Y', strtotime($end_date)) 之后,您可以使用 calculate_date 计算剩余时间。

      【讨论】:

        【解决方案4】:

        干净、干燥、专业、现代的方法是创建两个日期时间对象并调用diff()。生成的 diff 对象会自动为您填充年、月、日值。

        然后您只需要遍历包含所需单位的查找数组并将任何非零结果内爆到纯英文输出字符串中。

        代码 (Demo)

        $startDate = '2001-04-20';
        $endDate = '2015-11-29';
        $diff = (new DateTime($startDate))->diff(new DateTime($endDate));
        
        $lookup = [
            'y' => 'Year',
            'm' => 'Month',
            'd' => 'Day',
        ];
        
        $elements = [];
        foreach ($lookup as $property => $word) {
            if ($diff->$property) {
                $elements[] = "{$diff->$property} $word" . ($diff->$property !== 1 ? 's' : '');
            }
        }
        echo implode(' : ', $elements);
        // 14 Years : 7 Months : 9 Days
        

        【讨论】:

          猜你喜欢
          • 2019-05-12
          • 1970-01-01
          • 1970-01-01
          • 2016-10-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-14
          • 1970-01-01
          相关资源
          最近更新 更多