Относительная дата и чище «вчера» и «позавчера»

1

Я изменил скрипт, чтобы получить относительную дату из timestamp (x times ago), и я хотел бы настроить его, чтобы добавить еще один уровень точности, такой как "вчера" или "позавчера".

Пробовал это, и он работает, но он не очень чистый, у вас есть идея, как я могу упростить две строки после "последних дней"?

function relativedate($timestamp, $limit = 1209600){
    $diff = time() - $timestamp;
    $time = ($diff < 1) ? 1 : $diff;
    $times = array(
        "year"   => 31536000,
        "month"  => 2592000,
        "week"   => 604800,
        "day"    => 86400,
        "hour"   => 3600,
        "minute" => 60,
        "second" => 1
    );

    // Date limit as displayed full
    if ($limit > 0 && $diff > $limit){
        return "on ".date("d/m/Y - H:i:s", $timestamp);
    }

    // Recent days
    if ($diff > $times["day"]       && $diff < ($times["day"] * 2)-1) return "yesterday";
    if ($diff > ($times["day"] * 2) && $diff < ($times["day"] * 3)-1) return "the day before yesterday";

    // Display x time ago
    foreach ($times as $unit => $seconds){
        if ($time < $seconds) continue;
        $amount = floor($time / $seconds);
        return "since $amount $unit".(($amount > 1) ? "s" : "");
    }
}

РЕДАКТИРОВАТЬ:
И мое редактирование, и ответ работают, но он все еще не так чист? Попытка выяснить, как я могу это сделать по-другому... Любое предложение приветствуется :)
Подумал о strtotime("yesterday") и strtotime("-2 days")?

  • 0
    Почему бы не использовать углерод ?
  • 0
    @Kyslik - это небольшая функция на моем сайте, для этого не нужна полная библиотека!
Показать ещё 3 комментария
Теги:
date
relative

1 ответ

1

Попробуй это:

function relativedate($timestamp, $limit = 1209600){
    $diff = time() - $timestamp;
    $time = ($diff < 1) ? 1 : $diff;
    $value = '';
    $times = array(
        31536000 => "year",
        2592000 => "month",
        604800 => "week",
        86400 => "day",
        3600 => "hour",
        60 => "minute",
        1 => "second"
    );
    // Date limit as displayed full
    if ($limit > 0 && $diff > $limit){
        return "on ".date("d/m/Y - H:i:s", $timestamp);
    }
    // Recent days
    if ($diff >= (24*60*60) && $diff < (48*60*60)) {
        $value = "yesterday";
    }
    if ($diff >= (48*60*60) && $diff < (72*60*60)) {
        $value = "the day before yesterday";
    }
    // Display x time ago
    foreach ($times as $seconds => $text){
        if ($time < $seconds) continue;
        $amount = floor($time / $seconds);
        $value = "since $amount $text".(($amount > 1 && $text != "mois") ? "s" : "");
        break;
    }
    return $value;
}

echo relativedate(strtotime("-1 hour")).'<br />';
echo relativedate(strtotime("-23 hour")).'<br />';
echo relativedate(strtotime("-25 hour")).'<br />';
echo relativedate(strtotime("-49 hour")).'<br />';
echo relativedate(strtotime("-73 hour")).'<br />';
echo relativedate(strtotime("-1173 hour")).'<br />';

Результат:

since 1 hour
since 23 hours
since 1 day
since 2 days
since 3 days
on 22/09/2015 - 21:47:59
  • 0
    Я уже пробовал это, но это возвращает меня всегда "вчера", даже если это всего лишь один или два часа.
  • 0
    Здесь отлично работает. Проверьте, какое значение имеет ваша переменная $ timestamp при передаче ее в вызов функции.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню