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

在PHP中自动格式化两个日期之间的差异,php,datetime,Php,Datetime,好的,我有两个日期,第一个是用户上次活动的时间,第二个是当前日期时间。我可以使用DateTime::diff函数计算这两个日期之间的差异 $last_active = new DateTime($user['last_active']); $current_date = new DateTime(); $interval = $last_active->diff($current_date); 这准确地告诉了我这两个日期之间的差异。但是,我不知道应该如何使用它以我需要的方式格式化字符串(

好的,我有两个日期,第一个是用户上次活动的时间,第二个是当前日期时间。我可以使用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天”之类的字符串)

我建议从php.net上由acrion@gmail.com:

所以你需要这样的东西:

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”后缀,可以自由删除它。

您可以维护一个包含两列的表格,用于给定日期差异范围的开始和结束。与每个这样的范围相关联的是您在问题中向我们展示的标签之一。然后,您只需根据表查找范围即可获取适当的标签。您可以使用类似Carbon:(Carbon:)的库,它扩展了PHP的内置DateTime类以提供类似这样的功能。不幸的是,我无权实现新列或使用新库。
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);