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
  • 1 706
  • 0
Создаём рулетку с разной вероятностью выпадения призов на PHP
Создаём рулетку с разной вероятностью выпадения призов на PHP
3-07-2022, 15:17, PHP
Movie

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

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

{login}

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

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

Рекламный блок
  • Новости
  • Платная категория
  • Блог
  • Игры
  • Обновления
  • Программы
  • Статьи
    • PHP
    • Python
    • JS
  • Дизайн
    • PSD исходники
  • DLE
    • Шаблоны
    • Модули
    • Хаки
  • Магазин
    • Скрипты
Комментарии
Система комментариев на PHP
<Script>Alert("hello");</Script>
Генерация всевозможных комбинаций из набора символов — комбинаторика в Python (itertools)
Qwertyuiopasdfghjklzxcvbnm 1234567890
Система комментариев на PHP
Полезная статья
Создание простого Telegram-бота с клавиатурой и inline-кнопками [Часть 2]
Класс, хорошая тема
Динамическая обложка для группы ВК, последний подписчик, топ комментатор и прочее
Как отключить вывод результата cron в папку modules/cron в Open Server? Крон запускает несколько
Все комментарии..
Полный список последних комментариев
Лучшие новости
Всего публикаций: 115
Добавлено за сутки: +0
Записей в блоге: 1
Добавлено за сутки: +0
Комментариев: 938
Добавлено за сутки: +0
Пользователей: 4124
Добавлено за сутки: +0
Полная статистика..
Подробная статистика сайта
Loading...

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

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

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

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

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

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