【问题标题】:PHP Time Ago in Years, months, weeks, days (weeks preference)以年、月、周、日表示的 PHP 时间(周偏好)
【发布时间】:2014-01-25 04:34:49
【问题描述】:

我一直在考虑创建一个自定义的 time ago 函数,它接受一个日期并以人类可读的格式返回这是过去或未来多长时间。

虽然我不想使用标准的 timeago 函数,但我希望它仅在日期小于 20 周前返回以周和天为单位的时间。如果日期超过 20 周,则它可以像往常一样返回以年、月、周和日为单位的时间。

我目前的功能如下,但如果日期是 9 周前(即 2013 年 11 月 5 日),它会返回 2 个月零 2 天前的时间,而不是 9 周前。

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',
);
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) . ' old' : 'just now';
} 

【问题讨论】:

  • 我在你的代码中没有看到任何 20,你在哪里检查 20 周的事情?
  • 尝试一下,如果不行我们会帮忙

标签: php date


【解决方案1】:

你可以替换:

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

与:

if (20 > $diff->days / 7) {
    $diff->y = $diff->m = $diff->h = $diff->i = $diff->s = 0;
    $diff->w = floor($diff->days / 7);
    $diff->d = $diff->days - $diff->w * 7;
} else {
    $diff->w = floor($diff->d / 7);
    $diff->d -= $diff->w * 7;
}

demo

link to the function

【讨论】:

  • @user1052096:你看过演示吗?怎么行不通?能具体一点吗?
  • 抱歉,刚刚通过演示再次尝试过,效果很好,谢谢。
猜你喜欢
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2020-02-11
  • 2018-06-15
  • 2014-02-19
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多