【问题标题】:Converting timestamp to time ago in PHP - Plurality在 PHP 中将时间戳转换为时间前 - 复数
【发布时间】:2020-05-31 12:26:07
【问题描述】:

在 Stackoverflow (Converting timestamp to time ago in PHP e.g 1 day ago, 2 days ago...) 的帮助下,我发现了如何在 PHP 中将时间戳转换为时间前格式。在当前的解决方案中,复数被定义为 + 's' (这在英语中很好)......但是如果你想为每个时间单位手动更改此逻辑该怎么办(因为对于某些语言,此逻辑无效) ?例如,在荷兰语中 year = jaar 和 years = jaren,month = maand 和 months = maanden,week = week 和 week = weken。

    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';
}

【问题讨论】:

    标签: php mysql


    【解决方案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;
    
        $periods = array(
            'y' => ['jaar', 'jaren'],
            'm' => ['maand', 'maanden'],
            'w' => ['week', 'weken'],
            'd' => ['dag', 'dagen'],
            'h' => ['uur', 'uren'],
            'i' => ['minuut', 'minuten'],
            's' => ['seconde', 'seconden']
        );
    
        $parts = array();
        foreach ($periods as $k => &$v) {
            if ($diff->$k) {
                $parts[] = $diff->$k . ' ' . $v[$diff->$k > 1];
            }
        }
    
        if (!$full) $parts = array_slice($parts, 0, 1);
        return $parts ? implode(', ', $parts) . ' ago' : 'just now';
    }
    

    示例用法:

    echo time_elapsed_string('2020-03-21 00:30:16') . PHP_EOL;
    echo time_elapsed_string('2020-03-21 00:30:16', true) . PHP_EOL;
    

    输出:

    2 maanden ago
    2 maanden, 1 week, 3 dagen, 14 uren, 6 minuten, 55 seconden ago
    

    Demo on 3v4l.org

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-04
      • 2016-11-27
      • 2017-01-18
      • 2017-03-30
      • 2013-01-04
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多