在PHP中自动格式化两个日期之间的差异

时间:2019-04-24 16:59:47

标签: php datetime

好的,所以我有两个日期,第一个是用户上次活动的日期,第二个是当前日期时间。我可以使用DateTime :: diff函数计算这两个日期之间的差。

$last_active = new DateTime($user['last_active']);
$current_date = new DateTime();
$interval = $last_active->diff($current_date);

这准确地给了我两个日期之间的区别。但是,我对如何使用此格式来格式化字符串(我根据需要的时间)感到困惑(当然,这取决于经过了多少天):

“今天”,“ 1天”,“ 1周”,“ 2周和2天”,“ 1个月3周和2天”

这样的事情,如果您需要更多的解释,请提出要求。我真的很需要这个,而且我不知道如何在不编写百万个if语句的情况下实现它,而且没人愿意这样做。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

您将需要进行一些计数,而不能跳过该计数,您只需保持尽可能清晰,同时在所有情况下仍保持有效的结果(例如,避免获取诸如“ 1 days”之类的字符串)。

我建议从 acrion@gmail.com 在php.net上编写的以下代码段开始:

function pluralize( $count, $text )
{
    return $count . ( ( $count == 1 ) ? ( " $text" ) : ( " ${text}s" ) );
}

function ago( $datetime )
{
    $interval = date_create('now')->diff( $datetime );
    $suffix = ( $interval->invert ? ' ago' : '' );
    if ( $v = $interval->y >= 1 ) return pluralize( $interval->y, 'year' ) . $suffix;
    if ( $v = $interval->m >= 1 ) return pluralize( $interval->m, 'month' ) . $suffix;
    if ( $v = $interval->d >= 1 ) return pluralize( $interval->d, 'day' ) . $suffix;
    if ( $v = $interval->h >= 1 ) return pluralize( $interval->h, 'hour' ) . $suffix;
    if ( $v = $interval->i >= 1 ) return pluralize( $interval->i, 'minute' ) . $suffix;
    return pluralize( $interval->s, 'second' ) . $suffix;
}

Source

所以您需要这样的东西:

function pluralize( $count, $text )
{
    return $count . ( ( $count == 1 ) ? ( " $text" ) : ( " ${text}s" ) );
}

function ago( $datetime )
{
    $interval = date_create('now')->diff( $datetime );
    $suffix = ( $interval->invert ? ' ago' : '' );
    if ( $v = $interval->y >= 1 ) return pluralize( $interval->y, 'year' ) . $suffix;
    if ( $v = $interval->m >= 1 ) return pluralize( $interval->m, 'month' ) . $suffix;
    if ( $v = $interval->d >= 1 ) return pluralize( $interval->d, 'day' ) . $suffix;
    if ( $v = $interval->h >= 1 ) return pluralize( $interval->h, 'hour' ) . $suffix;
    if ( $v = $interval->i >= 1 ) return pluralize( $interval->i, 'minute' ) . $suffix;
    return pluralize( $interval->s, 'second' ) . $suffix;
}

$last_active = new DateTime($user['last_active']);
$interval = pluralize($last_active);

这对于正向和负向差异都有效,尽管如果您希望避免使用“ ago”后缀,则可以随意删除它。