За последние 24 часа нас посетили 22636 программистов и 1282 робота. Сейчас ищут 918 программистов ...

Дата в формате: minutes ago, days ago ...

Тема в разделе "PHP и базы данных", создана пользователем lemonl, 10 июн 2012.

  1. lemonl

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

    С нами с:
    10 июн 2009
    Сообщения:
    164
    Симпатии:
    0
    Здравствуйте,

    Подскажите пожалуйста, как показать сколько времени прошло с момента публикации...
    Нужно выводить дату в таком формате, например: 25 minutes ago, 1 day ago, 2 days ago и т.д.
    Если прошло очень много времени тогда показывать дату в таком формате: Apr 05

    Дата публикации имеет вид: YYYY-mm-dd HH:ii:ss
     
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    в mktime() можно загнать значения и вычесть из текущего time().
     
  3. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    Сначала надо решить где именно форматировать дату: в mysql, php или javascript
    Мне кажется естественным делать это именно в JS, т.к. если страницу не обновлять, время типа "5 минут назад" через минуту становится "6 минут назад" )))
    То есть мы должны формировать страницу с датой-временем отформатированным всегда одинаково, вообще не париться об этом. А дальше пусть трудится jQuery или еще что.
     
  4. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Дельная мысль!
     
  5. lemonl

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

    С нами с:
    10 июн 2009
    Сообщения:
    164
    Симпатии:
    0
    Такой вывод дат используют многие сайты. Вывод нужно делать в неком интервале, а не каждую минуту, например:
    в интервале (10 минут) - "5 минут назад" - "15 минут назад" - "25 минут назад" - "35 минут назад" и т.д.

    Я думаю это можно реализовать через php, текущая дата - дата публикации = разница. Не могу понять как сделать вывод минут, а после еще дня (1 день назад) и даты (Apr 05)...
     
  6. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    lemonl, не могу понять в чем проблема с минутами ) забудь про "интервалы".
    если не изобретать ничего, в php принято держать дату-время как unixtime, т.е. как число секунд с дня X.
    разница между двумя датами < 60 это "менее 1 минуты", < 300 "это менее 5 минут" и т.д. — дни, месяцы и годы. всё в секундах, понимаешь?
    проблема возникает только когда выбирают <матное слово> способ хранения, отличный от числового. типа "чтобы в phpmyadmin выводилось красиво". как будто вашему пользователю не п о х у й как оно выглядит там внутри.
     
  7. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    таймштамп отлично выводится в сеукндах и в дате. не надо гнать на грамотный подход, из за того, что криворукие проеры не умеют работать с мускулом.
     
  8. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Пользователю-то может и всё равно, но мне - нет. Если придётся вдруг копаться в базе вручную, через phpMyAdmin - то DATETIME просто удобнее. Помимо этого, можно всякие операции с датами делать средствами MySQL в запросах. Кроме того, нету ограничения 01.01.1970, 0:00:00 ... 19.01.2038, 07:14:07 - это бывает нужно.
    Да и вдруг конец света не настанет и сайт доработает до 2038-го? Придётся всё переделывать :)))
     
  9. lemonl

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

    С нами с:
    10 июн 2009
    Сообщения:
    164
    Симпатии:
    0
    Есть ли хоть какие-то примеры как это сделать?
     
  10. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    я ж тебе дал ответ =) остальное ручками

    Код (PHP):
    1.   function HumanDate($date) {
    2.     $date = strtotime($date);
    3.     $diff = time() - $date;
    4.  
    5.     if ($diff < 0) {
    6.       //для прошлого
    7.       $days = ceil($diff / 86400);
    8.     } else {
    9.       //для будущего
    10.       $days = floor($diff / 86400);
    11.     }
    12.     $hd = '';
    13.     if ($days == 0) {
    14. //сегодня
    15.       $hd = 'сегодня в ' . date('H:i', $date);
    16.     } else {
    17.       if ($days > 0) {
    18. //прошлое
    19.         switch ($days) {
    20.           case 1:
    21.             $hd = 'вчера в ' . date('H:i', $date);
    22.             break;
    23.           case 2:
    24.             $hd = 'позавчера в ' . date('H:i', $date);
    25.             break;
    26.         }
    27.       } else {
    28. //будущее
    29.         switch ($days) {
    30.           case -1:
    31.             $hd = 'завтра в ' . date('H:i', $date);
    32.             break;
    33.           case -2:
    34.             $hd = 'послезавтра в ' . date('H:i', $date);
    35.             break;
    36.           case -3:
    37.             $hd = 'через три дня';
    38.             break;
    39.         }
    40.       }
    41.     }
    42.     if ($hd == '') {
    43.       $hd = date('d.m.Y H:i', $date);
    44.     }
    45.     return '<acronym title="' . date('d.m.Y H:i', $date) . ', ' . self::$weekdays[date('N', $date)] . '">' . $hd . '</acronym>';
    46.   }
    47.  
    48.   function HumanDatePrecise($date) {
    49.     $r = false;
    50.     $a = preg_split("/[:\.\s-]+/", $date);
    51.     $d = time() - strtotime($date);
    52.     if ($d > 0) {
    53.       if ($d < 3600) {
    54. //минут назад
    55.         switch (floor($d / 60)) {
    56.           case 0:
    57.           case 1:
    58.             return "<acronym title='$date'>только что</acronym>";
    59.             break;
    60.           case 2:
    61.             return "<acronym title='$date'>только что</acronym>";
    62.             break;
    63.           case 3:
    64.             return "<acronym title='$date'>три минуты назад</acronym>";
    65.             break;
    66.           case 4:
    67.             return "<acronym title='$date'>четыре минуты назад</acronym>";
    68.             break;
    69.           case 5:
    70.             return "<acronym title='$date'>пять минут минуты назад</acronym>";
    71.             break;
    72.           default:
    73.             return "<acronym title='$date'>" . floor($d / 60) . ' мин. назад</acronym>';
    74.             break;
    75.         };
    76.       } elseif ($d < 18000) {
    77. //часов назад
    78.         switch (floor($d / 3600)) {
    79.           case 1:
    80.             return "<acronym title='$date'>час назад</acronym>";
    81.             break;
    82.           case 2:
    83.             return "<acronym title='$date'>два часа назад</acronym>";
    84.             break;
    85.           case 3:
    86.             return "<acronym title='$date'>три часа назад</acronym>";
    87.             break;
    88.           case 4:
    89.             return "<acronym title='$date'>четыре часа назад</acronym>";
    90.             break;
    91.         };
    92.       } elseif ($d < 172800) {
    93. //сегодня
    94. //2011-07-14 16:20:44
    95. // 0    1  2  3  4  5
    96.         if (date('d') == $a[2]) {
    97.           return "<acronym title='$date'>сегодня в {$a[3]}:{$a[4]}</acronym>";
    98.         }
    99.         if (date('d', time() - 86400) == $a[2]) {
    100.           return "<acronym title='$date'>вчера в {$a[3]}:{$a[4]}</acronym>";
    101.         }
    102.         if (date('d', time() - 172800) == $a[2]) {
    103.           return "<acronym title='$date'>позавчера в {$a[3]}:{$a[4]}</acronym>";
    104.         }
    105.       }
    106.     } else {
    107. ////////////////////////////////////////////////////////////////////////////////////////
    108. // В будущем   <editor-fold defaultstate="collapsed" desc="В будущем">
    109.       $d *= - 1;
    110.       if ($d < 3600) {
    111. //минут назад
    112.         switch (floor($d / 60)) {
    113.           case 0:
    114.           case 1:
    115.             return "<acronym title='$date'>сейчас</acronym>";
    116.             break;
    117.           case 2:
    118.             return "<acronym title='$date'>через две минуты</acronym>";
    119.             break;
    120.           case 3:
    121.             return "<acronym title='$date'>через три минуты</acronym>";
    122.             break;
    123.           case 4:
    124.             return "<acronym title='$date'>через четыре минуты</acronym>";
    125.             break;
    126.           case 5:
    127.             return "<acronym title='$date'>через пять минут</acronym>";
    128.             break;
    129.           default:
    130.             return "<acronym title='$date'>через " . floor($d / 60) . ' мин.</acronym>';
    131.             break;
    132.         };
    133.       } elseif ($d < 18000) {
    134. //часов назад
    135.         switch (floor($d / 3600)) {
    136.           case 1:
    137.             return "<acronym title='$date'>через час</acronym>";
    138.             break;
    139.           case 2:
    140.             return "<acronym title='$date'>через два часа</acronym>";
    141.             break;
    142.           case 3:
    143.             return "<acronym title='$date'>через три часа</acronym>";
    144.             break;
    145.           case 4:
    146.             return "<acronym title='$date'>через четыре часа</acronym>";
    147.             break;
    148.         };
    149.       } elseif ($d < 172800) {
    150. //сегодня
    151. //2011-07-14 16:20:44
    152. // 0    1  2  3  4  5
    153.         if (date('d') == $a[2]) {
    154.           return "<acronym title='$date'>сегодня в {$a[3]}:{$a[4]}</acronym>";
    155.         }
    156.         if (date('d', time() - 86400) == $a[2]) {
    157.           return "<acronym title='$date'>завтра в {$a[3]}:{$a[4]}</acronym>";
    158.         }
    159.         if (date('d', time() - 172800) == $a[2]) {
    160.           return "<acronym title='$date'>послезавтра в {$a[3]}:{$a[4]}</acronym>";
    161.         }
    162.       }
    163.       $d *= - 1;
    164. //, В будущем   </editor-fold>
    165. ////////////////////////////////////////////////////////////////////////////////////////.
    166.     }
    167.  
    168.     $r = "{$a[2]}.{$a[1]}";
    169.     if ($a[0] != date('Y') OR $d > 0) {
    170.       $r .= '.' . $a[0];
    171.     }
    172.     $r .= {$a[3]}:{$a[4]}";
    173.     $date.= ', ' . self::$weekdays[(int) date('N', strtotime($date))];
    174.     return "<acronym title='$date'>$r</acronym>";
    175.   } 
     
  11. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    sobachnik, давай не отрываться от темы. Да в MySql есть удобное представление — для работы с датой внутри запросов MySql. Но, цитирую диалог:
    так вот, если вычисления делать в PHP, то майсиквельный тип "дата" не дает ничего кроме лишней конвертации.

    Добавлено спустя 4 минуты 41 секунду:
    Кстати, таймстамп не накладывает ограничений на диапазон дат. Допустимы отрицательные значения, а максимальное значение зависит от платформы. Уж точно до 2038года нынешние 32битные компы не доживут.
     
  12. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    таймштамп хорош хотя бы тем, что автоматически вычисляется с учетом часового пояса.
     
  13. phper

    phper Новичок

    С нами с:
    21 авг 2013
    Сообщения:
    2
    Симпатии:
    0
    Вот небольшой скрипт реализующий это. Правда здесь формат на русском языке (дней/минут/недель назад), но переделать не составит труда.
     
  14. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    В пхп есть нативные механизмы вычисления разницы между датами и занимает это две-три строки. Сам только недавно заметил. =)

    http://php.ru/manual/datetime.diff.html