【问题标题】:Find difference between two datetimes and format at Y-m-d H:i:s在 Y-m-d H:i:s 处查找两个日期时间和格式之间的差异
【发布时间】:2022-03-25 11:11:42
【问题描述】:

我正在尝试获取两个日期时间之间的差异并将其作为datetime 返回。我找到了使用 diff 的示例,但我似乎无法正确理解。

$timein = date("Y-m-d H:i:s");
$timeout = date("Y-m-d 20:00:00");
$totaltime = $timein->diff($timeout);

但是 $totaltime0000-00-00 00:00:00 记录到我的数据库中。这是因为我没有格式化我的总时间变量吗?

【问题讨论】:

  • date() 给你字符串。你不能用字符串计算差异。

标签: php datetime date-difference


【解决方案1】:

我不确定您在寻找什么格式的差异,但这里是使用 DateTime 的方法

$datetime1 = new DateTime();
$datetime2 = new DateTime('2011-01-03 17:13:00');
$interval = $datetime1->diff($datetime2);
$elapsed = $interval->format('%y years %m months %a days %h hours %i minutes %s seconds');
echo $elapsed;

【讨论】:

  • 抛出错误“致命错误:调用未定义的方法 DateTime::diff()”
  • 你运行的是什么版本的 PHP?
  • 这应该对你有用,因为 5.4 支持 diff() codepad.viper-7.com/FqGsrO
  • 我发现我的问题是将日期时间写入数据库,如果它是写入数据库的日期就好了,但日期时间没有。它需要采用这种格式 YYYY-MM-DD HH:MM:SS 或 Y-m-d H:i:s。
  • 此答案未提供正确格式的结果。
【解决方案2】:

您可以简单地使用日期时间差异和格式来计算差异。

<?php
$datetime1 = new DateTime('2009-10-11 12:12:00');
$datetime2 = new DateTime('2009-10-13 10:12:00');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%Y-%m-%d %H:%i:%s');
?>

有关 DATETIME 格式的更多信息,请参阅:here
您可以随意更改间隔格式。

Here 是工作示例

附:这些功能( diff()format())仅适用于 >=PHP 5.3.0

【讨论】:

  • 投反对票。这不会以 OP 要求的格式提供结果。
【解决方案3】:

John Conde 在他的方法中执行了所有正确的程序,但不满足您问题的最后一步,即根据您的规范格式化结果。 printf()sprintf()(取决于您的使用情况)是用所需的前导零格式化整数的一种优雅方法 - DateTime 类的 format() 方法不允许应用前导零。

下面的演示将显示原始差异,揭示尝试立即格式化原始差异的问题,并呈现正确格式化的结果。

代码:(Demo)

$datetime1 = new DateTime('2017-04-26 18:13:06');
$datetime2 = new DateTime('2011-01-17 17:13:00');  // change the millennium to see output difference
$diff = $datetime1->diff($datetime2);

// this will get you very close, but it will not pad the digits to conform with your expected format
echo "Raw Difference: " . $diff->format('%y years %m months %d days %h hours %i minutes %s seconds') . "\n";

// Notice the impact when you change $datetime2's millennium from '1' to '2'
echo "Invalid format: " . $diff->format('%Y-%m-%d %H:%i:%s') . "\n";  // only H does it right

// isolated datetime diff values
$details = array_intersect_key((array)$diff,array_flip(['y','m','d','h','i','s']));
echo '$diff = ' . var_export($details, true) . "\n";

// now all components of datetime are properly padded
printf(
    "Valid format: %04d-%02d-%02d %02d:%02d:%02d",
    $diff->y,
    $diff->m,
    $diff->d,
    $diff->h,
    $diff->i,
    $diff->s
);

输出:

Raw Difference: 6 years 3 months 9 days 1 hours 0 minutes 6 seconds
Invalid format: 06-3-9 01:0:6
$diff = array (
  'y' => 6,
  'm' => 3,
  'd' => 9,
  'h' => 1,
  'i' => 0,
  's' => 6,
)
Valid format: 0006-03-09 01:00:06

【讨论】:

    【解决方案4】:

    下面的代码将仅显示找到值的差异,即,如果 years = 0,则它不会显示年份。

    
    $diffs = [
        'years' => 'y',
        'months' => 'm',
        'days' => 'd',
        'hours' => 'h',
        'minutes' => 'i',
        'seconds' => 's'
    ];
    
    $interval = $timeout->diff($timein);
    $diffArr = [];
    foreach ($diffs as $k => $v) {
        $d = $interval->format('%' . $v);
        if ($d > 0) {
            $diffArr[] = $d . ' ' . $k;
        }
    }    
    $diffStr = implode(', ', $diffArr);
    echo 'Difference: ' . ($diffStr == '' ? '0' : $diffStr) . PHP_EOL;
    

    【讨论】:

      【解决方案5】:

      对不起,我之前的回答是错误的。如果您尝试以Y-m-d H:i:s 格式获取时间和超时之间的总经过时间,请在使用DateTime 对象时获取超时和时间之间的差异并将其格式化为'%y-%m-%d %H:%i:%s'.

      【讨论】:

      • 请解释你的答案,不要只发布代码。
      【解决方案6】:

      我收集了许多主题来制作具有许多输出(年、月、日、小时、分钟、秒)的通用函数,使用字符串或解析为 int 和方向 +- 如果您需要知道差异的方向是哪一边。

      使用示例:

      
      
          $date1='2016-05-27 02:00:00';
          $format='Y-m-d H:i:s';
      
          echo timeDifference($date1, $format, '2017-08-30 00:01:59', $format); 
          #1 years 3 months 2 days 22 hours 1 minutes 59 seconds (string)
      
          echo timeDifference($date1, $format, '2017-08-30 00:01:59', $format,false, '%a days %h hours');
          #459 days 22 hours (string)
      
          echo timeDifference('2016-05-27 00:00:00', $format, '2017-08-30 00:01:59', $format,true, '%d days -> %H:%I:%S', true);
          #-3 days -> 00:01:59 (string)
      
          echo timeDifference($date1, $format, '2016-05-27 00:05:51', $format, false, 'seconds');
          #9 (string)
      
          echo timeDifference($date1, $format, '2016-05-27 07:00:00', $format, false, 'hours');
          #5 (string)
      
          echo timeDifference($date1, $format, '2016-05-27 07:00:00', $format, true, 'hours');
          #-5 (string)
      
          echo timeDifference($date1, $format, '2016-05-27 07:00:00', $format, true, 'hours',true);
          #-5 (int)
      
      

      功能

      
      
          function timeDifference($date1_pm_checked, $date1_format,$date2, $date2_format, $plus_minus=false, $return='all', $parseInt=false)
          {
              $strtotime1=strtotime($date1_pm_checked);
              $strtotime2=strtotime($date2);
              $date1 = new DateTime(date($date1_format, $strtotime1));
              $date2 = new DateTime(date($date2_format, $strtotime2));
              $interval=$date1->diff($date2);
      
              $plus_minus=(empty($plus_minus)) ? '' : ( ($strtotime1 > $strtotime2) ? '+' : '-'); # +/-/no_sign before value 
      
              switch($return)
              {
                  case 'y';
                  case 'year';
                  case 'years';
                      $elapsed = $interval->format($plus_minus.'%y');
                      break;
      
                  case 'm';
                  case 'month';
                  case 'months';
                      $elapsed = $interval->format($plus_minus.'%m');
                      break;
      
                  case 'a';
                  case 'day';
                  case 'days';
                      $elapsed = $interval->format($plus_minus.'%a');
                      break;
      
                  case 'd';
                      $elapsed = $interval->format($plus_minus.'%d');
                      break;
      
                  case 'h';       
                  case 'hour';        
                  case 'hours';       
                      $elapsed = $interval->format($plus_minus.'%h');
                      break;
      
                  case 'i';
                  case 'minute';
                  case 'minutes';
                      $elapsed = $interval->format($plus_minus.'%i');
                      break;
      
                  case 's';
                  case 'second';
                  case 'seconds';
                      $elapsed = $interval->format($plus_minus.'%s');
                      break;
      
                  case 'all':
                      $parseInt=false;
                      $elapsed = $plus_minus.$interval->format('%y years %m months %d days %h hours %i minutes %s seconds');
                      break;
      
                  default:
                      $parseInt=false;
                      $elapsed = $plus_minus.$interval->format($return);
              }
      
              if($parseInt)
                  return (int) $elapsed;
              else
                  return $elapsed;
      
          }
      
      

      【讨论】:

        【解决方案7】:

        这是我的完整帖子主题: PHP find difference between two datetimes

        使用示例

        
            echo timeDifference('2016-05-27 02:00:00', 'Y-m-d H:i:s', '2017-08-30 00:01:59', 'Y-m-d H:i:s', false, '%a days %h hours');
            #459 days 22 hours (string)
        
            echo timeDifference('2016-05-27 02:00:00', 'Y-m-d H:i:s', '2016-05-27 07:00:00', 'Y-m-d H:i:s', true, 'hours',true);
            #-5 (int)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-23
          • 2015-07-01
          • 1970-01-01
          相关资源
          最近更新 更多