За последние 24 часа нас посетили 5026 программистов и 659 роботов. Сейчас ищут 145 программистов ...

Вывод даты публикации статьи

Тема в разделе "Сделайте за меня", создана пользователем Dgikar, 19 янв 2019.

  1. Dgikar

    Dgikar Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    Интернет
    Всем привет!

    Есть функция, она выводит дату публикации: (например) 27 минут назад. А после прошествии часа (с момента публикации статьи), выводит "сегодня в 15:24", а после 24-х часов (ну типа после 12-ти ночи), выводит: "вчера в 15:24"...

    PHP:
    1. function publish_date($timestamp) {
    2.     $current_time = time();
    3.     $publish_time = strtotime($timestamp);
    4.     $time_diff = $current_time - $publish_time;
    5.  
    6.     $seconds = $time_diff;
    7.     $minutes = round($seconds / 60);
    8.     $days = round($seconds / 86400);
    9.  
    10.     $minutes_interval = $minutes >= 2 && $minutes <= 4 || $minutes >= 22 && $minutes <= 24 || $minutes >= 32 && $minutes <= 34 || $minutes >= 42 && $minutes <= 44 || $minutes >= 52 && $minutes <= 54;
    11.     $minut_interval   = $minutes == 0 || $minutes >= 5 && $minutes <= 20 || $minutes >= 25 && $minutes <= 30 || $minutes >= 35 && $minutes <= 40 || $minutes >= 45 && $minutes <= 50 || $minutes >= 55 && $minutes <= 60;
    12.     $minuta_interval  = $minutes == 1 | $minutes == 21 || $minutes == 31 || $minutes == 41 || $minutes == 51;
    13.  
    14.     $jtext_minut   = JText::_('COM_CCK_MINUT') . " " . JText::_('COM_CCK_AGO');
    15.     $jtext_minuta  = JText::_('COM_CCK_MINUTE') . " " . JText::_('COM_CCK_AGO');
    16.     $jtext_minutes = JText::_('COM_CCK_MINUTES') . " " . JText::_('COM_CCK_AGO');
    17.  
    18.     if ($seconds <= 60) {
    19.       echo "<span>" . JText::_('COM_CCK_JUST_NOW') . "</span>";
    20.     } else if ($minutes <= 59) {
    21.       if ($minutes == 1) {
    22.         echo "<span>" . JText::_('COM_CCK_JUST_NOW') . "</span>";
    23.       } else if ($minutes_interval) {
    24.         echo "<span>" . $minutes . " " . $jtext_minutes . "</span>";
    25.       } else if ($minut_interval) {
    26.         echo "<span>" . $minutes . " " . $jtext_minut . "</span>";
    27.       } else if ($minuta_interval) {
    28.         echo "<span>" . $minutes . " " . $jtext_minuta . "</span>";
    29.       }
    30.     } else if ($days == 0) {
    31.       echo "<span>" . JText::_('COM_CCK_TODAY_AT') . " " . JHtml::_('date', $timestamp, JText::_('DATE_FORMAT_LC12')) . "</span>";
    32.     }else if ($days == 1) {
    33.       echo "<span>" . JText::_('COM_CCK_YESTERDAY_IN') . " " . JHtml::_('date', $timestamp, JText::_('DATE_FORMAT_LC12')) . "</span>";
    34.     } else {
    35.       echo "<span>" . JHtml::_('date', $timestamp, JText::_('DATE_FORMAT_LC2')) . "</span>";
    36.     }
    37.   }

    DATE_FORMAT_LC12="H:i"
    Код (Javascript):
    1. COM_CCK_JUST_NOW="опубликовано только что"
    2. COM_CCK_MINUT="минут"
    3. COM_CCK_MINUTE="минута"
    4. COM_CCK_MINUTES="минуты"
    5. COM_CCK_AGO="назад"

    В базе данных, дата публикации записана по UTC времени.

    Функция сама по себе работает относительно нормально! Т. е. до
    PHP:
    1. } else if ($days == 0) {
    все работает как часики, но вот начиная с вышеупомянутой строки, начинаются проблемы...

    Например (сегодня 19.01.2019. Время: 03:27. Я указываю при создании статьи, что она опубликована 18.01.2019 в 23:30), то функция выдаст что статья опубликована "сегодня в 23:30". Если я перезагружу страницу 19.01.2019 в 17:53, то функция покажет что статья опубликована вчера в 23:30...

    Я так понимаю что все это из-за того, что во второй строке функции, strtotime - преобразует текстовое представление даты в метку времени Unix чтобы можно было корректно вычесть даты в $time_diff

    Если сделать формат (т. е. привести UNIX формат в человеческий вид) и вывести количество дней:
    PHP:
    1. echo = gmdate("d", $time_diff);
    и посмотреть что выдаст, то в зависимости от того, который час в данную секунду, выводимая информация будет разная: или 00 или 01. Т. е. 19.01.2019 в 03:27, функция покажет 00, а 19.01.2019 в 17:53, функция покажет 01...

    Я так понимаю это происходит из-за смещения по UTC... Но это не точно...

    Одним словом, я не знаю что нужно сделать, чтобы решить эту задачу...

    P. S.
    Знаю что первый ответ который может быть: "Зачем придумывать велосипед?! В Инете, уже давно решали и не раз эту задачу...", а второй ответ: "юзай JS"... Это стандартные ответы в большинстве случаев...

    Скажу сразу, JS не хочу юзать. Хочу закончить ИМЕННО! этот код! СВОЙ код!​

    P. P. S.
    Вот этот код нужен для того, чтобы появилась возможность склонения слова минута:
    • минуТ
    • минуТА
    • минуТЫ
    PHP:
    1. $minutes_interval = $minutes >= 2 && $minutes <= 4 || $minutes >= 22 && $minutes <= 24 || $minutes >= 32 && $minutes <= 34 || $minutes >= 42 && $minutes <= 44 || $minutes >= 52 && $minutes <= 54;
    2. $minut_interval   = $minutes == 0 || $minutes >= 5 && $minutes <= 20 || $minutes >= 25 && $minutes <= 30 || $minutes >= 35 && $minutes <= 40 || $minutes >= 45 && $minutes <= 50 || $minutes >= 55 && $minutes <= 60;
    3. $minuta_interval  = $minutes == 1 | $minutes == 21 || $minutes == 31 || $minutes == 41 || $minutes == 51;

    Буду благодарен, если кто-то поможет этот код (всей функции) сделать более элегантным.
    Заранее благодарю за ответы!
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    9.399
    Симпатии:
    734
    Адрес:
    из России с любовью
    Как же так получилось, что пост в разделе "Сделайте за меня"? Врядли код можно будет считать ТВОИМ.

    Моё ИМХО: подобные функции делают на JS потому что результат должен быть "живым". Предположим при выводе страницы что-то было помечено как "27 минут назад", потом читатель отправился на обед не закрыв страницу. Когда он вернётся через час относительное время публикации статьи ну никак не будет "27 минут назад", а скорее "полтора часа назад". Повторю, страница висит та же без перезагрузки. PHP не в силах переделать время вживую.
     
  3. Dgikar

    Dgikar Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    Интернет
    Все просто: у меня не хватает знаний чтобы "закрыть этот вопрос". Из-за этого я не могу понять как правильно (и что именно) привести (или $time_diff или $current_time или $publish_time) к временной зоне моего скрипта (я работаю с Joomla 3.9)... А может я вобще н туда смотрю и нужно совсем не эти переменные трогать...

    Согласен, но пока никто не помог мне с решением, и не внес свои правки, код то мой! :) Это потом он уже будет не мой

    Да, возможно Вы и правы и так было бы более юзерфрэндли, но мне бы хотя бы этот код довести до ума...
     
  4. Dgikar

    Dgikar Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    8
    Симпатии:
    0
    Адрес:
    Интернет
    По моему вопросу: вопрос - закрыт! Всего лишь 5-ть суток понадобилось чтобы решить эту задачу... :) мелочи!

    PHP:
    1. function publish_date($timestamp) {
    2.         $current_time = time();
    3.         $publish_time = strtotime($timestamp);
    4.         $time_diff = $current_time - $publish_time;
    5.  
    6.         $seconds = $time_diff;
    7.         $minutes = round($seconds / 60); // 60 secund. Minuti w UNIX formate dati
    8.         $days = JHtml::_('date', $current_time, 'd') - JHtml::_('date', $publish_time, 'd');
    9.  
    10.         $minutes_interval = $minutes >= 2 && $minutes <= 4 || $minutes >= 22 && $minutes <= 24 || $minutes >= 32 && $minutes <= 34 || $minutes >= 42 && $minutes <= 44 || $minutes >= 52 && $minutes <= 54;
    11.         $minut_interval   = $minutes == 0 || $minutes >= 5 && $minutes <= 20 || $minutes >= 25 && $minutes <= 30 || $minutes >= 35 && $minutes <= 40 || $minutes >= 45 && $minutes <= 50 || $minutes >= 55 && $minutes <= 60;
    12.         $minuta_interval  = $minutes == 1 | $minutes == 21 || $minutes == 31 || $minutes == 41 || $minutes == 51;
    13.  
    14.         if ($seconds <= 60) {
    15.             return "<span>" . JText::_('COM_CCK_JUST_NOW') . "</span>";
    16.         } else if ($minutes <= 59) {
    17.             if ($minutes == 1) {
    18.                 return "<span>" . JText::_('COM_CCK_JUST_NOW') . "</span>";
    19.             } else if ($minutes_interval) {
    20.                 return "<span>" . $minutes . " " . JText::_('COM_CCK_MINUTES') . " " . JText::_('COM_CCK_AGO') . "</span>";
    21.             } else if ($minut_interval) {
    22.                 return "<span>" . $minutes . " " . JText::_('COM_CCK_MINUT') . " " . JText::_('COM_CCK_AGO') . "</span>";
    23.             } else if ($minuta_interval) {
    24.                 return "<span>" . $minutes . " " . JText::_('COM_CCK_MINUTE') . " " . JText::_('COM_CCK_AGO') . "</span>";
    25.             }
    26.         } else if ($days == 0) {
    27.             return "<span>" . JText::_('COM_CCK_TODAY_AT') . " " . JHtml::_('date', $timestamp, JText::_('DATE_FORMAT_LC12')) . "</span>";
    28.         }else if ($days == 1) {
    29.             return "<span>" . JText::_('COM_CCK_YESTERDAY_IN') . " " . JHtml::_('date', $timestamp, JText::_('DATE_FORMAT_LC12')) . "</span>";
    30.         } else {
    31.             return "<span>" . JHtml::_('date', $timestamp, JText::_('DATE_FORMAT_LC2')) . "</span>";
    32.         }
    33.     }
    artoodetoo, а Вам не сложно (для тех кто в танке), привести пример как связать PHP и этот JS? Ато я снова потрачу пару недель на метод научного тыка... Да! Не спорю! Метод хорош для изучения языка (лучше запоминается!), но как сказал Сенека: "Долог путь поучения, краток и успешен путь примеров"

    Заранее благодарю за ответ!
     
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    9.399
    Симпатии:
    734
    Адрес:
    из России с любовью
    На офф. сайте http://timeago.yarp.com есть ссылка download на архив с примерами.