KOTOFF.NET
  • Главная
  • Пользователи
  • Контакты
  • Статистика
  • Правила
  • О нас
  • Вход / Регистрация

Форматы вывода дат относительно текущего времени

Статьи / PHP


В этой статье рассмотрим возможность вывода дат в динамическом формате относительно текущего момента (например: только что, 5 минут назад, позавчера, 1 июня и т.д.). Нечто похожее, кстати, можно увидеть в ВК.



Для реализации буду создавать класс Date с несколькими статическими методами, каждый из которых будет возвращать дату в определённом формате. Также для вывода месяцев и дней недели в нужном падеже подключу библиотеку Morphos. Конечно, на небольшом сайте лишь ради дат подключать целую библиотеку не стоит, резоннее будет просклонять два десятка слов вручную. Но для статьи я всё же её подключу.


Начинаем писать код с подключения библиотеки, пишем класс Date и сразу вставляем два массива с названиями месяцев и дней недели:

<?php

require 'vendor/autoload.php'; // Подключаем библ.


class Date
{

    private static $months = array (
        1 => 'январь', 2 => 'февраль', 3 => 'март',
        4 => 'апрель', 5 => 'май', 6 => 'июнь',
        7 => 'июль', 8 => 'август', 9 => 'сентябрь',
        10 => 'октябрь', 11 => 'ноябрь', 12 => 'декабрь'
    );

    private static $weekday = array (
        'воскресенье', 'понедельник', 'вторник',
        'среда', 'четверг', 'пятница', 'суббота'
    );


    // Тут будут методы класса

}


1. Метод ago()

Первый метод ago() будет возвращать дату в формате относительно текущего времени (в зависимости от интервала):

public static function ago( $timestamp )
{
    $interval = time() - $timestamp;


    if ( $interval < 60 ) // Если интервал меньше 60 секунд
        return 'только что';

    if ( $interval < 120 ) // Если интервал меньше 2-х минут (120с)
        return 'минуту назад';

    if ( $interval < 3600  ) // Если интервал меньше часа
        return \morphos\Russian\TimeSpeller::spellDifference( '+' . intdiv( $interval, 60 ) . ' minutes' ) . ' назад';

    if ( $interval < 7200 ) // Если интервал меньше двух часов
        return 'час назад';

    if ( $interval < 14400 ) // Если интервал меньше четырёх часов
        return floor( $interval / 3600 ) . ' часа назад';

    if ( date( 'd.m.Y', $timestamp ) == date( 'd.m.Y', time() ) ) // Если это текущий день
        return 'сегодня в ' . date( 'H:i', $timestamp );

    if ( $timestamp >= mktime( 0, 0, 0, date( 'm' ), date( 'd' ) - 1, date( 'Y' ) ) and $timestamp < mktime( 0, 0, 0, date( 'm' ), date( 'd' ), date( 'Y' ) ) ) // Если это вчерашний день
        return 'вчера в ' . date( 'H:i', $timestamp );

    if ( $timestamp < mktime( 0, 0, 0, date( 'm' ), date( 'd' ) - 1, date( 'Y' ) ) and $timestamp >= mktime( 0, 0, 0, 1, 1, date( 'Y' ) ) ) // Если текущий год
        return date( 'n', $timestamp ) . ' ' . \morphos\Russian\NounDeclension::getCase( self::$months[date( 'n', $timestamp )], 'родительный' );

    if ( $timestamp < mktime( 0, 0, 0, date( 'm' ), date( 'd' ) - 1, date( 'Y' ) ) and $timestamp < mktime( 0, 0, 0, 1, 1, date( 'Y' ) ) ) // Если это уже прошедший год
        return date( 'n', $timestamp ) . ' ' . \morphos\Russian\NounDeclension::getCase( self::$months[date( 'n', $timestamp )], 'родительный' ) . ', ' . date( 'Y', $timestamp );
    
    
    return 'Не определено';
}

На вход метод получает таймштумп и возвращает строку. Также тут можно сразу заметить библиотечные методы. Всего их тут два:

  • Метод GetCase() класса NounDeclension — возвращает слово в указанном падеже;
  • Метод spellDifference() класса TimeSpeller — временной интервал между текущим временем и $dateTime (в рассматриваемом случае - интервал в минутах):


2. Метод dayMonthYear()

Да, другого названия не придумал 🙁 

Метод получает всё тот же таймштамп и возвращает дату в формате "число месяц, год" (пример: 4 января, 2008):

public static function dayMonthYear( $timestamp )
{
    $month = \morphos\Russian\NounDeclension::getCase( self::$months[date( 'n', $timestamp )], 'родительный' ); // Склоняем месяц в Р.П.

    return date( 'd', $timestamp ) . ' ' . $month . ', ' . date( 'Y', $timestamp );
}


3. Метод relatToday()

В отличие от метода ago() возвращает только число (без времени), а также день недели (если это текущий год):

public static function relatToday( $timestamp )
{
    $today_start = mktime( 0, 0, 0, date( 'm' ), date( 'd' ), date( 'Y' ) ); // Начало сегодняшего дня


    if ( $today_start <= $timestamp ) // Если это сегодняшний (текущий) день
        return 'Сегодня';

    if ( $today_start - 86400 <= $timestamp ) // Если это вчерашний день
        return 'Вчера';

    if ( $today_start - 86400 * 2 <= $timestamp ) // Если это позавчерашний день
        return 'Позавчера';

    if ( date( 'Y' ) == date( 'Y', $timestamp ) ) // Если это текущий год
        return date( 'j', $timestamp ) . ' ' . \morphos\Russian\NounDeclension::getCase( self::$months[date( 'n', $timestamp )], 'родительный' ) . ', ' . self::$weekday[date( 'w', $timestamp )];

    if ( date( 'Y' ) > date( 'Y', $timestamp ) ) // Если прошедний год
        return date( 'j', $timestamp ) . ' ' . \morphos\Russian\NounDeclension::getCase( self::$months[date( 'n', $timestamp )], 'родительный' ) . ', ' . date( 'Y', $timestamp );


    return 'Не определено';
}



Теперь можно протестить, как и что воркает:

echo Date::ago( 1657715033 ) . '<br>';
echo Date::ago( 1657711033 ) . '<br>';
echo Date::ago( 1657617829 ) . '<br>';
echo Date::ago( 1657013029 ) . '<br>';
echo Date::ago( 1625390629 ) . '<br>';

echo '<br>';

echo Date::dayMonthYear( 1573721072 ) . '<br>';

echo '<br>';

echo Date::relatToday( 1657715033 ) . '<br>';
echo Date::relatToday( 1657617957 ) . '<br>';
echo Date::relatToday( 1657531557 ) . '<br>';
echo Date::relatToday( 1657358757 ) . '<br>';
echo Date::relatToday( 1554629157 ) . '<br>';


На этом всё) Архив с файлами из статьи прикрепляю:

date.zip

  • 5id15
  • 14.07.2022
  • 337
  • 0
Создаём рулетку с разной вероятностью выпадения призов на PHP
Создаём рулетку с разной вероятностью выпадения призов на PHP
3-07-2022, 15:17, PHP
Movie

Нет комментариев. Не желаешь оставить первый комментарий?

Перед публикацией, советую ознакомится с правилами!

{login}

Твой комментарий..

Заказывай!
Разработка ботов на заказ, любой сложности, обращаться:
 VK KOTOFF.net - Сообщество, в личные сообщения или по контактам указанным там 
 mail: [email protected]

Рекламный блок
  • Новости
  • Блог
  • Игры
  • Обновления
  • Программы
  • Статьи
    • PHP
    • Python
  • Дизайн
    • PSD исходники
  • DLE
    • Шаблоны
    • Модули
    • Хаки
  • Магазин
Комментарии
Готовый обработчик платежей ANYPAY.io для ботов ВК и сайтов
А ты сделай на сайт этот шаблон какой-то и отправь запрос они примут
Вывод записей из БД по дням (по месяцам)
А можно просто сгрупировать нужные данные по дням в sql запросе и не городить кучу ненужно кода.
Скрипт исключения из беседы VK и не только, написанный на PHP
Если Ваш код соответствует, то в $userinfo будут лежать first_name и last_name
Callback-кнопки для бота ВК
Если есть предложения про что конкретно нужно написать статью, пишите)
Callback-кнопки для бота ВК
Спасибо за статью! Читаю все ваши статьи про создание ботов, мне было очень полезно! Странно, что
Все комментарии..
Полный список последних комментариев
Лучшие новости
Создание простого Telegram-бота с клавиатурой и inline-кнопками [Часть 2]

Создание простого

10-08-2022, 20:16
Стейты для бота ВК (последовательный ввод step by step)

Стейты для бота ВК

20-07-2022, 20:03
Callback-кнопки для бота ВК

Callback-кнопки для бота ВК

22-07-2022, 20:20
Карусели для бота ВК

Карусели для бота ВК

24-07-2022, 15:48
Создаем бота VK на библиотеке SimpleVK 3.x [Часть 1]

Создаем бота VK на

26-07-2022, 17:01
Форматы вывода дат относительно текущего времени

Форматы вывода дат

14-07-2022, 00:16
Вывод записей из БД по дням (по месяцам)

Вывод записей из БД по дням

15-07-2022, 15:02
Пагинация кнопок для LongPoll-бота ВК — на библиотеке SimpleVK 3.x [Часть 2]

Пагинация кнопок для

4-08-2022, 16:43
Поиск записей в группе ВКонтакте по автору

Поиск записей в группе

3-08-2022, 17:26
Всего публикаций: 66
Добавлено за сутки: +0
Записей в блоге: 1
Добавлено за сутки: +0
Комментариев: 810
Добавлено за сутки: +0
Пользователей: 3711
Добавлено за сутки: +0
Полная статистика..
Подробная статистика сайта
Loading...

Нашли ошибку?
Вы можете сообщить об этом администрации.
Выделив текст нажмите CTRL+Enter

Полезные ссылки
  • О проекте
  • Наши контакты
  • Администрация
  • Рекламные материалы
  • Идеи и предложения
  • Ответы на вопросы
Информация
  • Условия сделки
  • Способы оплаты
  • Поддержка / F.A.Q
  • Онлайн документация
  • Статистика сайта
  • Список пользователей
Услуги/Работа
  • Разработка ботов ВК
  • Обновление проекта
  • Консультация/поддержка
KOTOFF.net

Copyright © Footer 2019-2022. All right reserved.
KOTOFF.net - Уроки по PHP, SQL, IT новости
Быстрый вход

Используйте социальные сети для быстрой регистрации и авторизации.

Google
ВКонтакте
Яндекс
Mail.ru
Создать аккаунт / Регистрация
Авторизация

Я забыл свой пароль