格式化具有最小差异的日期时间间隔

知乎

发现这个非常好的 PHP 脚本可以将任何日期时间转换为相对字符串,例如:

'2013-05-01 00:22:35'  ->  '3 months ago'

这真的很酷,但我想“欺骗”这个函数,这样即使日期是,比方说,20 分钟前,函数返回1 hour ago而不是20 minutes ago. 因此,我想强制执行 1 小时的最小差异,即使差异小于 1 小时。

作为参考,这里是功能。

function time_elapsed_string($datetime, $full = false) {
  $now = new DateTime;
  $ago = new DateTime($datetime);
  $diff = $now->diff($ago);

  $diff->w = floor($diff->d / 7);
  $diff->d -= $diff->w * 7;

  $string = array(
    'y' => 'year',
    'm' => 'month',
    'w' => 'week',
    'd' => 'day',
    'h' => 'hour',
    'i' => 'minute',
    's' => 'second',
  );
  foreach ($string as $k => &$v) {
    if ($diff->$k) {
      $v = $diff->$k . ' ' . $v . ($diff->$k > 1 ? 's' : '');
    } else {
      unset($string[$k]);
    }
  }

  if (!$full) $string = array_slice($string, 0, 1);
  return $string ? implode(', ', $string) . ' ago' : 'just now';
}

我尝试了很多不同的东西,但没有一个真正奏效。

如何强制执行至少 1 小时的差异?

只是个学生

找出差异后,只需检查最大差异是否只有几分钟或几秒。如果是这样,请返回您需要的至少 1 小时。

// here is your foreach loop

// check if less than 1 hour, if so, return that
$keys = array_keys($string);
if ($keys[0] === 'i' || $keys[0] === 's') {
  return 'less than 1 hour ago';
}

在线试试吧!
我把发布问题的时间放在这个例子中。当您在 1 小时后查看它时,您必须将测试用例修改为一个不到 1 小时前的 UTC 时间的 DateTime。

测试用例。现在是 2017-06-10 12:45:00 UTC。

time_elapsed_string("2017-06-10 12:11:19"); // less than 1 hour ago
time_elapsed_string("2017-06-10 11:44:00"); // 1 hour ago
time_elapsed_string("2017-06-10 11:44:00", true); // 1 hour, 1 minute ago
time_elapsed_string("2017-06-09 11:45:00", true); // 1 day, 1 hour ago
time_elapsed_string("2017-06-09 11:45:00"); // 1 day ago

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章