【问题标题】:PHP DateTime Remove Zero Values from diff()PHP DateTime 从 diff() 中删除零值
【发布时间】:2017-04-23 16:57:12
【问题描述】:

我正在使用它来创建一个带有日期差异的字符串:

$startDate = DateTime::createFromFormat(self::$timeFormat, $startDate);
$difference = $startDate->diff($endDate);

$dateTimeElapsed = $difference->format('%y years %m months %a days %h hours %i minutes %S seconds');

return $dateTimeElapsed;

这将输出如下内容: 0 年 0 个月 0 天 0 小时 0 分 27 秒

如何编码,以便删除任何零值,例如 0 年、月等...

【问题讨论】:

  • $timeFormat$startDate 的内容是什么,你可能想把$dateTimeElapsed 中的所有0 替换掉。
  • 格式为 23/04/2017 17:47:42
  • 看看这里。它可能会有所帮助:stackoverflow.com/questions/1416697/…

标签: php datetime


【解决方案1】:

整理

$dateTimeElapsed = $difference->format('%y|%m|%a|%h|%i|%S');

$outPuts = [
    "years", "months", "days", "hours", "minutes", "seconds"
];

$explodedDateString = explode("|", $dateTimeElapsed);

$dateTimeElapsed = array_combine($outPuts, $explodedDateString);

$finalDateDiff = 0;
foreach($dateTimeElapsed as $string => $value)
{
   if($value > 0)
   {
      if($value == 1)
      {
        $string = substr($string, 0, -1);
      }
       $finalDateDiff = $value . " " . $string;
       break;
    }
}

return $finalDateDiff;

仅输出大于零的最接近的值。使用 explode 将差异值放入数组中。将两个数组组合在一起,使字符串名称“年、月”等与它们的值匹配,然后使用 foreach 来检查值是否超过 0。

如果不匹配或所有值为0,则返回0。

编辑: 更新了代码,以便当差异为 1 年、1 个月、1 天等时......它会删除末尾的 's' 以使其在语法上正确。

【讨论】:

    【解决方案2】:

    一个简单的解决方案是使用 php Carbon class 中的 diffForHumans() 函数:

    $dt = Carbon::createFromFormat('Y-m-d H:i:s', '2017-01-22 15:30:00');   
    echo $dt->diffForHumans();
    

    输出:

    3 个月前

    diffForHumans() documentation on carbon.nesbot.com

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-12
      • 1970-01-01
      • 2012-03-30
      • 1970-01-01
      • 1970-01-01
      • 2013-07-15
      • 1970-01-01
      相关资源
      最近更新 更多