powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
58 сообщений из 58, показаны все 3 страниц
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343001
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите реализовать такую штуку

Есть три таблицы t1 t2 t3 структура разная но вот эти ячейки одинаковые id|data|name
Я понимаю что нужно сделать выборку за последние 24 часа.

Хочу сделать так:
1мин. назад Вася создал запись
10 мин. назад Коля выколупал казявку из носа
3 часа назад Петя ткнул пальцем в ...

Как это можно сделать?
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343075
JustCrazy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Маша и,
тыц
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343283
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JustCrazy,

Спасибо, но это не совсем то, дело не в мульти-запросе, а в
этой штуке

допустим запрос типа такой
select *
f
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
rom t.1, t.2, t.3 
WHERE data>= DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY)
if(mysql_num_rows($res) > 0)
		{ 
             while ($row = mysql_fetch_assoc($res))
               {
              $row['id'] = $row['id'];
              $row['data'] = FuncDate($valdate);// $row['data']-дата создания записи, переменная $date - в формате msql unix (2007-11-30 10:30:19)
              $row['name'] = $row['name'];
              $top .= parseTpl($tpl, $row);
               } 
       }


у меня есть функция, но она считает от текущей даты, а мне нужно тоже самое только от даты создания - $row['data']
функция выглядит так
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
  function HumanDatePrecise($date) {
    $r = false;
    $a = preg_split("/[:\.\s-]+/", $date);
    $d = time() - strtotime($date);
    if ($d > 0) {
      if ($d < 3600) {
//минут назад
        switch (floor($d / 60)) {
          case 0:
          case 1:
            return "<acronym title='$date'>только что</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>только что</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>три минуты назад</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>четыре минуты назад</acronym>";
            break;
          case 5:
            return "<acronym title='$date'>пять минут минуты назад</acronym>";
            break;
          default:
            return "<acronym title='$date'>" . floor($d / 60) . ' мин. назад</acronym>';
            break;
        };
      } elseif ($d < 18000) {
//часов назад
        switch (floor($d / 3600)) {
          case 1:
            return "<acronym title='$date'>час назад</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>два часа назад</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>три часа назад</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>четыре часа назад</acronym>";
            break;
        };
      } elseif ($d < 172800) {
//сегодня
//2011-07-14 16:20:44
// 0    1  2  3  4  5
        if (date('d') == $a[2]) {
          return "<acronym title='$date'>сегодня в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 86400) == $a[2]) {
          return "<acronym title='$date'>вчера в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 172800) == $a[2]) {
          return "<acronym title='$date'>позавчера в {$a[3]}:{$a[4]}</acronym>";
        }
      }
    } else {
////////////////////////////////////////////////////////////////////////////////////////
// В будущем   <editor-fold defaultstate="collapsed" desc="В будущем">
      $d *= - 1;
      if ($d < 3600) {
//минут назад
        switch (floor($d / 60)) {
          case 0:
          case 1:
            return "<acronym title='$date'>сейчас</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>через две минуты</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>через три минуты</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>через четыре минуты</acronym>";
            break;
          case 5:
            return "<acronym title='$date'>через пять минут</acronym>";
            break;
          default:
            return "<acronym title='$date'>через " . floor($d / 60) . ' мин.</acronym>';
            break;
        };
      } elseif ($d < 18000) {
//часов назад
        switch (floor($d / 3600)) {
          case 1:
            return "<acronym title='$date'>через час</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>через два часа</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>через три часа</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>через четыре часа</acronym>";
            break;
        };
      } elseif ($d < 172800) {
//сегодня
//2011-07-14 16:20:44
// 0    1  2  3  4  5
        if (date('d') == $a[2]) {
          return "<acronym title='$date'>сегодня в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 86400) == $a[2]) {
          return "<acronym title='$date'>завтра в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 172800) == $a[2]) {
          return "<acronym title='$date'>послезавтра в {$a[3]}:{$a[4]}</acronym>";
        }
      }
      $d *= - 1;
//, В будущем   </editor-fold>
////////////////////////////////////////////////////////////////////////////////////////.
    }

    $r = "{$a[2]}.{$a[1]}";
    if ($a[0] != date('Y') OR $d > 0) {
      $r .= '.' . $a[0];
    }
    $r .= " {$a[3]}:{$a[4]}";
    $date.= ', ' . self::$weekdays[(int) date('N', strtotime($date))];
    return "<acronym title='$date'>$r</acronym>";
  } 



как её переделать и прикрутить к запросам, не понимаю, помогите спасите :)
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343286
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маша и,

Код: plsql
1.
2.
3.
4.
5.
6.
(SELECT id, data, name FROM t1 WHERE DATEDIFF(HOUR, data, NOW())) 
UNION 
(SELECT id, data, name FROM t2 WHERE DATEDIFF(HOUR, data, NOW())) 
UNION 
(SELECT id, data, name FROM t3 WHERE DATEDIFF(HOUR, data, NOW())) 
ORDER by data desc



Нету на чём проверить, но если нигде не ошибся, то так. А эти "10мин назад" и всё такое лучше уже посчитать в PHP а не в mysql.

JustCrazy, ссылка не имеет никакого отношения к задаче. Там таблицы "в ширину" склеивают, а тут надо взять все строки с первой, второй и третьей и потом их слепить в одну выборку. Так что тут UNION :)
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343297
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПрограмёрМаша и,

Код: plsql
1.
2.
3.
4.
5.
6.
(SELECT id, data, name FROM t1 WHERE DATEDIFF(HOUR, data, NOW())) 
UNION 
(SELECT id, data, name FROM t2 WHERE DATEDIFF(HOUR, data, NOW())) 
UNION 
(SELECT id, data, name FROM t3 WHERE DATEDIFF(HOUR, data, NOW())) 
ORDER by data desc



Нету на чём проверить, но если нигде не ошибся, то так. А эти "10мин назад" и всё такое лучше уже посчитать в PHP а не в mysql.

JustCrazy, ссылка не имеет никакого отношения к задаче. Там таблицы "в ширину" склеивают, а тут надо взять все строки с первой, второй и третьей и потом их слепить в одну выборку. Так что тут UNION :)

ок, так вопрос мой как раз в том как сделать "10мин назад", помогите подскажите :)
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343404
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маша иJustCrazy,

Спасибо, но это не совсем то, дело не в мульти-запросе, а в
этой штуке

допустим запрос типа такой
select *
f
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
rom t.1, t.2, t.3 
WHERE data>= DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY)
if(mysql_num_rows($res) > 0)
		{ 
             while ($row = mysql_fetch_assoc($res))
               {
              $row['id'] = $row['id'];
              $row['data'] = FuncDate($valdate);// $row['data']-дата создания записи, переменная $date - в формате msql unix (2007-11-30 10:30:19)
              $row['name'] = $row['name'];
              $top .= parseTpl($tpl, $row);
               } 
       }


у меня есть функция, но она считает от текущей даты, а мне нужно тоже самое только от даты создания - $row['data']
функция выглядит так
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
  function HumanDatePrecise($date) {
    $r = false;
    $a = preg_split("/[:\.\s-]+/", $date);
    $d = time() - strtotime($date);
    if ($d > 0) {
      if ($d < 3600) {
//минут назад
        switch (floor($d / 60)) {
          case 0:
          case 1:
            return "<acronym title='$date'>только что</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>только что</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>три минуты назад</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>четыре минуты назад</acronym>";
            break;
          case 5:
            return "<acronym title='$date'>пять минут минуты назад</acronym>";
            break;
          default:
            return "<acronym title='$date'>" . floor($d / 60) . ' мин. назад</acronym>';
            break;
        };
      } elseif ($d < 18000) {
//часов назад
        switch (floor($d / 3600)) {
          case 1:
            return "<acronym title='$date'>час назад</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>два часа назад</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>три часа назад</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>четыре часа назад</acronym>";
            break;
        };
      } elseif ($d < 172800) {
//сегодня
//2011-07-14 16:20:44
// 0    1  2  3  4  5
        if (date('d') == $a[2]) {
          return "<acronym title='$date'>сегодня в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 86400) == $a[2]) {
          return "<acronym title='$date'>вчера в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 172800) == $a[2]) {
          return "<acronym title='$date'>позавчера в {$a[3]}:{$a[4]}</acronym>";
        }
      }
    } else {
////////////////////////////////////////////////////////////////////////////////////////
// В будущем   <editor-fold defaultstate="collapsed" desc="В будущем">
      $d *= - 1;
      if ($d < 3600) {
//минут назад
        switch (floor($d / 60)) {
          case 0:
          case 1:
            return "<acronym title='$date'>сейчас</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>через две минуты</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>через три минуты</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>через четыре минуты</acronym>";
            break;
          case 5:
            return "<acronym title='$date'>через пять минут</acronym>";
            break;
          default:
            return "<acronym title='$date'>через " . floor($d / 60) . ' мин.</acronym>';
            break;
        };
      } elseif ($d < 18000) {
//часов назад
        switch (floor($d / 3600)) {
          case 1:
            return "<acronym title='$date'>через час</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>через два часа</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>через три часа</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>через четыре часа</acronym>";
            break;
        };
      } elseif ($d < 172800) {
//сегодня
//2011-07-14 16:20:44
// 0    1  2  3  4  5
        if (date('d') == $a[2]) {
          return "<acronym title='$date'>сегодня в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 86400) == $a[2]) {
          return "<acronym title='$date'>завтра в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 172800) == $a[2]) {
          return "<acronym title='$date'>послезавтра в {$a[3]}:{$a[4]}</acronym>";
        }
      }
      $d *= - 1;
//, В будущем   </editor-fold>
////////////////////////////////////////////////////////////////////////////////////////.
    }

    $r = "{$a[2]}.{$a[1]}";
    if ($a[0] != date('Y') OR $d > 0) {
      $r .= '.' . $a[0];
    }
    $r .= " {$a[3]}:{$a[4]}";
    $date.= ', ' . self::$weekdays[(int) date('N', strtotime($date))];
    return "<acronym title='$date'>$r</acronym>";
  } 



как её переделать и прикрутить к запросам, не понимаю, помогите спасите :)


Ну нифига себе наворотили

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
function padezh($num, $p1, $p2, $p5){
  $x = $num % 100;
  $y = ($x % 10)-1;
  $res = ($x/10)>>0==1 ? $p5 : ($y&12 ? $p5 : ($y&3 ? $p2 : $p1));
  return $res;
}

function dateDiff($d, $now = null){
  if ($now===null) $now = date("Y-m-d H:i:s");
  $snow = strtotime($now);
  $sd = strtotime($d);
  $seconds = $snow-$sd;
  $aseconds = abs($seconds);
  if ($aseconds<120){
    return ($seconds<0 ? "Только что" : "Сейчас");
  }
  elseif($aseconds<3600){
    return ($seconds<0 ? "через " : "").(round($aseconds / 60) % 60)." ".padezh(round($aseconds / 60) % 60, "минуту", "минуты", "минут").($seconds>0 ? " назад" : "");
  }
  elseif($aseconds<18000){
    return ($seconds<0 ? "через " : "").(round($aseconds / 3600) % 24)." ".padezh(round($aseconds / 3600) % 24, "час", "часа", "часов").($seconds>0 ? " назад" : "");
  }
  elseif(($days = abs(strtotime(date("Y-m-d", $sd))-strtotime(date("Y-m-d", $snow)))/3600/24 >> 0)<3){
    if ($seconds>=0){
      switch($days){
        case 0: return "сегодня в ".date("H:i", $sd); break;
        case 1: return "вчера в ".date("H:i", $sd); break;
        case 2: return "позавчера в ".date("H:i", $sd); break;
      }
    }
    else{
      switch($days){
        case 0: return "сегодня в ".date("H:i", $sd); break;
        case 1: return "завтра в ".date("H:i", $sd); break;
        case 2: return "послезавтра в ".date("H:i", $sd); break;
      }
    }
  }
  else{
    return date("Y-m-d H:i", $sd);
  }
}



Погонять по всем вариантам не могу (времени мало), но вроде работает на опробованных.
Ввёл округление, что бы "час 58 минут" не считалось как "1 час", а считалось как "2 часа".
Слова "один", "два", "три" заменил на цифры, что бы не усложнять.
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343432
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Програмёр
Маша иJustCrazy,

Спасибо, но это не совсем то, дело не в мульти-запросе, а в
этой штуке

допустим запрос типа такой
select *
f
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
rom t.1, t.2, t.3 
WHERE data>= DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY)
if(mysql_num_rows($res) > 0)
		{ 
             while ($row = mysql_fetch_assoc($res))
               {
              $row['id'] = $row['id'];
              $row['data'] = FuncDate($valdate);// $row['data']-дата создания записи, переменная $date - в формате msql unix (2007-11-30 10:30:19)
              $row['name'] = $row['name'];
              $top .= parseTpl($tpl, $row);
               } 
       }


у меня есть функция, но она считает от текущей даты, а мне нужно тоже самое только от даты создания - $row['data']
функция выглядит так
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
  function HumanDatePrecise($date) {
    $r = false;
    $a = preg_split("/[:\.\s-]+/", $date);
    $d = time() - strtotime($date);
    if ($d > 0) {
      if ($d < 3600) {
//минут назад
        switch (floor($d / 60)) {
          case 0:
          case 1:
            return "<acronym title='$date'>только что</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>только что</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>три минуты назад</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>четыре минуты назад</acronym>";
            break;
          case 5:
            return "<acronym title='$date'>пять минут минуты назад</acronym>";
            break;
          default:
            return "<acronym title='$date'>" . floor($d / 60) . ' мин. назад</acronym>';
            break;
        };
      } elseif ($d < 18000) {
//часов назад
        switch (floor($d / 3600)) {
          case 1:
            return "<acronym title='$date'>час назад</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>два часа назад</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>три часа назад</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>четыре часа назад</acronym>";
            break;
        };
      } elseif ($d < 172800) {
//сегодня
//2011-07-14 16:20:44
// 0    1  2  3  4  5
        if (date('d') == $a[2]) {
          return "<acronym title='$date'>сегодня в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 86400) == $a[2]) {
          return "<acronym title='$date'>вчера в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 172800) == $a[2]) {
          return "<acronym title='$date'>позавчера в {$a[3]}:{$a[4]}</acronym>";
        }
      }
    } else {
////////////////////////////////////////////////////////////////////////////////////////
// В будущем   <editor-fold defaultstate="collapsed" desc="В будущем">
      $d *= - 1;
      if ($d < 3600) {
//минут назад
        switch (floor($d / 60)) {
          case 0:
          case 1:
            return "<acronym title='$date'>сейчас</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>через две минуты</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>через три минуты</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>через четыре минуты</acronym>";
            break;
          case 5:
            return "<acronym title='$date'>через пять минут</acronym>";
            break;
          default:
            return "<acronym title='$date'>через " . floor($d / 60) . ' мин.</acronym>';
            break;
        };
      } elseif ($d < 18000) {
//часов назад
        switch (floor($d / 3600)) {
          case 1:
            return "<acronym title='$date'>через час</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>через два часа</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>через три часа</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>через четыре часа</acronym>";
            break;
        };
      } elseif ($d < 172800) {
//сегодня
//2011-07-14 16:20:44
// 0    1  2  3  4  5
        if (date('d') == $a[2]) {
          return "<acronym title='$date'>сегодня в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 86400) == $a[2]) {
          return "<acronym title='$date'>завтра в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 172800) == $a[2]) {
          return "<acronym title='$date'>послезавтра в {$a[3]}:{$a[4]}</acronym>";
        }
      }
      $d *= - 1;
//, В будущем   </editor-fold>
////////////////////////////////////////////////////////////////////////////////////////.
    }

    $r = "{$a[2]}.{$a[1]}";
    if ($a[0] != date('Y') OR $d > 0) {
      $r .= '.' . $a[0];
    }
    $r .= " {$a[3]}:{$a[4]}";
    $date.= ', ' . self::$weekdays[(int) date('N', strtotime($date))];
    return "<acronym title='$date'>$r</acronym>";
  } 



как её переделать и прикрутить к запросам, не понимаю, помогите спасите :)


Ну нифига себе наворотили

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
function padezh($num, $p1, $p2, $p5){
  $x = $num % 100;
  $y = ($x % 10)-1;
  $res = ($x/10)>>0==1 ? $p5 : ($y&12 ? $p5 : ($y&3 ? $p2 : $p1));
  return $res;
}

function dateDiff($d, $now = null){
  if ($now===null) $now = date("Y-m-d H:i:s");
  $snow = strtotime($now);
  $sd = strtotime($d);
  $seconds = $snow-$sd;
  $aseconds = abs($seconds);
  if ($aseconds<120){
    return ($seconds<0 ? "Только что" : "Сейчас");
  }
  elseif($aseconds<3600){
    return ($seconds<0 ? "через " : "").(round($aseconds / 60) % 60)." ".padezh(round($aseconds / 60) % 60, "минуту", "минуты", "минут").($seconds>0 ? " назад" : "");
  }
  elseif($aseconds<18000){
    return ($seconds<0 ? "через " : "").(round($aseconds / 3600) % 24)." ".padezh(round($aseconds / 3600) % 24, "час", "часа", "часов").($seconds>0 ? " назад" : "");
  }
  elseif(($days = abs(strtotime(date("Y-m-d", $sd))-strtotime(date("Y-m-d", $snow)))/3600/24 >> 0)<3){
    if ($seconds>=0){
      switch($days){
        case 0: return "сегодня в ".date("H:i", $sd); break;
        case 1: return "вчера в ".date("H:i", $sd); break;
        case 2: return "позавчера в ".date("H:i", $sd); break;
      }
    }
    else{
      switch($days){
        case 0: return "сегодня в ".date("H:i", $sd); break;
        case 1: return "завтра в ".date("H:i", $sd); break;
        case 2: return "послезавтра в ".date("H:i", $sd); break;
      }
    }
  }
  else{
    return date("Y-m-d H:i", $sd);
  }
}



Погонять по всем вариантам не могу (времени мало), но вроде работает на опробованных.
Ввёл округление, что бы "час 58 минут" не считалось как "1 час", а считалось как "2 часа".
Слова "один", "два", "три" заменил на цифры, что бы не усложнять.

Супер-пупер, вечером опробую, о результате доложу! Спасибо!
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343529
DateTime
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор что бы не усложнять.
Код: php
1.
2.
3.
4.
5.
        $date = \DateTime::createFromFormat('Y/m/d H:i:s', '2013/07/25 00:00:00'); 
        //$date = new \DateTime("@1171502725"); from UNIX timestamp!!!
        $now = new \DateTime();
        $interval = $now->diff($date);
        var_dump($interval);


и погнали...
Код: php
1.
2.
3.
4.
5.
6.
$interval->y;
$interval->m;
$interval->d;
$interval->h;
$interval->i;
$interval->s;


почитать http://www.php.net/manual/ru/class.datetime.php#datetime.constants.atom
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343558
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DateTimeавтор что бы не усложнять.
Код: php
1.
2.
3.
4.
5.
        $date = \DateTime::createFromFormat('Y/m/d H:i:s', '2013/07/25 00:00:00'); 
        //$date = new \DateTime("@1171502725"); from UNIX timestamp!!!
        $now = new \DateTime();
        $interval = $now->diff($date);
        var_dump($interval);


и погнали...
Код: php
1.
2.
3.
4.
5.
6.
$interval->y;
$interval->m;
$interval->d;
$interval->h;
$interval->i;
$interval->s;


почитать http://www.php.net/manual/ru/class.datetime.php#datetime.constants.atom

и? :) Напишите работающий вариант, сравним.
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343580
DateTime
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторНапишите работающий вариант, сравним.
что там сравнивать?! банальные операции if else ?
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343602
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DateTimeавторНапишите работающий вариант, сравним.
что там сравнивать?! банальные операции if else ?

а я считаю что есть. Вы пишите "что бы не усложнять" и даёте данную функцию, намекая, что с ней будет легче написать то, что надо. Однако не пишите результирующий код. Заметьте, у меня тоже банальные if else и switch..case. Я предлагаю Вам написать конечный код, что бы сравнить какой вариант менее усложнённый.
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343615
DateTime
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор Я предлагаю Вам написать конечный код
автори? :)
будет время и необходимость - напишу обязательно!
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343622
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DateTimeавтор Я предлагаю Вам написать конечный код
автори? :)
будет время и необходимость - напишу обязательно!
Да-да напишите, очень интересно увидеть и другие варианты.
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343630
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
return (($number % 10 == 1) && ($number % 100 != 11)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2);


вот вам код для слонения числительных.
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343647
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Маша иПрограмёр
Маша иJustCrazy,

Спасибо, но это не совсем то, дело не в мульти-запросе, а в
этой штуке

допустим запрос типа такой
select *
f
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
rom t.1, t.2, t.3 
WHERE data>= DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY)
if(mysql_num_rows($res) > 0)
		{ 
             while ($row = mysql_fetch_assoc($res))
               {
              $row['id'] = $row['id'];
              $row['data'] = FuncDate($valdate);// $row['data']-дата создания записи, переменная $date - в формате msql unix (2007-11-30 10:30:19)
              $row['name'] = $row['name'];
              $top .= parseTpl($tpl, $row);
               } 
       }


у меня есть функция, но она считает от текущей даты, а мне нужно тоже самое только от даты создания - $row['data']
функция выглядит так
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
  function HumanDatePrecise($date) {
    $r = false;
    $a = preg_split("/[:\.\s-]+/", $date);
    $d = time() - strtotime($date);
    if ($d > 0) {
      if ($d < 3600) {
//минут назад
        switch (floor($d / 60)) {
          case 0:
          case 1:
            return "<acronym title='$date'>только что</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>только что</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>три минуты назад</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>четыре минуты назад</acronym>";
            break;
          case 5:
            return "<acronym title='$date'>пять минут минуты назад</acronym>";
            break;
          default:
            return "<acronym title='$date'>" . floor($d / 60) . ' мин. назад</acronym>';
            break;
        };
      } elseif ($d < 18000) {
//часов назад
        switch (floor($d / 3600)) {
          case 1:
            return "<acronym title='$date'>час назад</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>два часа назад</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>три часа назад</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>четыре часа назад</acronym>";
            break;
        };
      } elseif ($d < 172800) {
//сегодня
//2011-07-14 16:20:44
// 0    1  2  3  4  5
        if (date('d') == $a[2]) {
          return "<acronym title='$date'>сегодня в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 86400) == $a[2]) {
          return "<acronym title='$date'>вчера в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 172800) == $a[2]) {
          return "<acronym title='$date'>позавчера в {$a[3]}:{$a[4]}</acronym>";
        }
      }
    } else {
////////////////////////////////////////////////////////////////////////////////////////
// В будущем   <editor-fold defaultstate="collapsed" desc="В будущем">
      $d *= - 1;
      if ($d < 3600) {
//минут назад
        switch (floor($d / 60)) {
          case 0:
          case 1:
            return "<acronym title='$date'>сейчас</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>через две минуты</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>через три минуты</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>через четыре минуты</acronym>";
            break;
          case 5:
            return "<acronym title='$date'>через пять минут</acronym>";
            break;
          default:
            return "<acronym title='$date'>через " . floor($d / 60) . ' мин.</acronym>';
            break;
        };
      } elseif ($d < 18000) {
//часов назад
        switch (floor($d / 3600)) {
          case 1:
            return "<acronym title='$date'>через час</acronym>";
            break;
          case 2:
            return "<acronym title='$date'>через два часа</acronym>";
            break;
          case 3:
            return "<acronym title='$date'>через три часа</acronym>";
            break;
          case 4:
            return "<acronym title='$date'>через четыре часа</acronym>";
            break;
        };
      } elseif ($d < 172800) {
//сегодня
//2011-07-14 16:20:44
// 0    1  2  3  4  5
        if (date('d') == $a[2]) {
          return "<acronym title='$date'>сегодня в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 86400) == $a[2]) {
          return "<acronym title='$date'>завтра в {$a[3]}:{$a[4]}</acronym>";
        }
        if (date('d', time() - 172800) == $a[2]) {
          return "<acronym title='$date'>послезавтра в {$a[3]}:{$a[4]}</acronym>";
        }
      }
      $d *= - 1;
//, В будущем   </editor-fold>
////////////////////////////////////////////////////////////////////////////////////////.
    }

    $r = "{$a[2]}.{$a[1]}";
    if ($a[0] != date('Y') OR $d > 0) {
      $r .= '.' . $a[0];
    }
    $r .= " {$a[3]}:{$a[4]}";
    $date.= ', ' . self::$weekdays[(int) date('N', strtotime($date))];
    return "<acronym title='$date'>$r</acronym>";
  } 



как её переделать и прикрутить к запросам, не понимаю, помогите спасите :)


Ну нифига себе наворотили

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
function padezh($num, $p1, $p2, $p5){
  $x = $num % 100;
  $y = ($x % 10)-1;
  $res = ($x/10)>>0==1 ? $p5 : ($y&12 ? $p5 : ($y&3 ? $p2 : $p1));
  return $res;
}

function dateDiff($d, $now = null){
  if ($now===null) $now = date("Y-m-d H:i:s");
  $snow = strtotime($now);
  $sd = strtotime($d);
  $seconds = $snow-$sd;
  $aseconds = abs($seconds);
  if ($aseconds<120){
    return ($seconds<0 ? "Только что" : "Сейчас");
  }
  elseif($aseconds<3600){
    return ($seconds<0 ? "через " : "").(round($aseconds / 60) % 60)." ".padezh(round($aseconds / 60) % 60, "минуту", "минуты", "минут").($seconds>0 ? " назад" : "");
  }
  elseif($aseconds<18000){
    return ($seconds<0 ? "через " : "").(round($aseconds / 3600) % 24)." ".padezh(round($aseconds / 3600) % 24, "час", "часа", "часов").($seconds>0 ? " назад" : "");
  }
  elseif(($days = abs(strtotime(date("Y-m-d", $sd))-strtotime(date("Y-m-d", $snow)))/3600/24 >> 0)<3){
    if ($seconds>=0){
      switch($days){
        case 0: return "сегодня в ".date("H:i", $sd); break;
        case 1: return "вчера в ".date("H:i", $sd); break;
        case 2: return "позавчера в ".date("H:i", $sd); break;
      }
    }
    else{
      switch($days){
        case 0: return "сегодня в ".date("H:i", $sd); break;
        case 1: return "завтра в ".date("H:i", $sd); break;
        case 2: return "послезавтра в ".date("H:i", $sd); break;
      }
    }
  }
  else{
    return date("Y-m-d H:i", $sd);
  }
}



Погонять по всем вариантам не могу (времени мало), но вроде работает на опробованных.
Ввёл округление, что бы "час 58 минут" не считалось как "1 час", а считалось как "2 часа".
Слова "один", "два", "три" заменил на цифры, что бы не усложнять.

Супер-пупер, вечером опробую, о результате доложу! Спасибо!

А как обрабатывать вашей функцией результат?
Вот запрос, а как обработать помогите пожалуйста новичку?
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
$res = mysqlQuery("SELECT `id`, `date`, `name` 
                           FROM `user`  
                           WHERE `date` >= DATE_SUB(CURRENT_DATE, INTERVAL 400 DAY) ORDER BY `date` DESC");
if(mysql_num_rows($res) > 0)
		{ 
             while ($row = mysql_fetch_assoc($res))
               {
              $row['id'] = $row['id'];
              $row['date'] = $row['date'];// вот тут дата создания записи, наверное с ней нужно делать манипуляции?
              $row['name'] = $row['name'];
              $top .= parseTpl($tpl, $row);
               } 
       }
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343662
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маша и,

Код: php
1.
$row["data"]=dateDiff($row["data"]);



после выполнения в $row["data"] будет лежать нужное значение (относительно сейчас, если надо с другой датой сравнить, в функции предусмотрен второй аргумент).
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343666
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПрограмёрМаша и,

Код: php
1.
$row["data"]=dateDiff($row["data"]);



после выполнения в $row["data"] будет лежать нужное значение (относительно сейчас, если надо с другой датой сравнить, в функции предусмотрен второй аргумент).

hot fix:
Код: php
1.
$row["date"]=dateDiff($row["date"]);


в первом сообщении было $row["data"], не заметил, что в последнем уже "date" :)
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343684
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПрограмёрПрограмёрМаша и,

Код: php
1.
$row["data"]=dateDiff($row["data"]);



после выполнения в $row["data"] будет лежать нужное значение (относительно сейчас, если надо с другой датой сравнить, в функции предусмотрен второй аргумент).

hot fix:
Код: php
1.
$row["date"]=dateDiff($row["date"]);


в первом сообщении было $row["data"], не заметил, что в последнем уже "date" :)

Да, да это есть, я на почту вам, там и адрес сайта и т.д.
Оно просто дату из БД выводит и всё, странно... почему?
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343704
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маша и,

Ваш сайтик лежит :) так что там ничего не видно... А Вы бы лучше сюда ссылочку скинули (если конечно не стараетесь её в секрете сохранить), может ещё кто-нить что-то дельное подскажет.
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343712
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПрограмёрМаша и,

Ваш сайтик лежит :) так что там ничего не видно... А Вы бы лучше сюда ссылочку скинули (если конечно не стараетесь её в секрете сохранить), может ещё кто-нить что-то дельное подскажет.

так вот задача лежит из-за падежа, Fatal error: Cannot redeclare padezh() (previously declared in
показывает ошибку в этой строчке function padezh($num, $p1, $p2, $p5){
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343736
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маша иПрограмёрМаша и,

Ваш сайтик лежит :) так что там ничего не видно... А Вы бы лучше сюда ссылочку скинули (если конечно не стараетесь её в секрете сохранить), может ещё кто-нить что-то дельное подскажет.

так вот задача лежит из-за падежа, Fatal error: Cannot redeclare padezh() (previously declared in
показывает ошибку в этой строчке function padezh($num, $p1, $p2, $p5){

Хм. Вам бы учебничек по пхп какой-нить почитать ;). Вообщем или у Вас в коде уже была объявлена функция padezh или Вы мою функцию по ошибке дважды объявили. Вы все padezh в моём коде замените например на padezh2 и если вы не продублировали данный код по ошибке несколько раз - будет Вам счастье.
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343753
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПрограмёрМаша ипропущено...


так вот задача лежит из-за падежа, Fatal error: Cannot redeclare padezh() (previously declared in
показывает ошибку в этой строчке function padezh($num, $p1, $p2, $p5){

Хм. Вам бы учебничек по пхп какой-нить почитать ;). Вообщем или у Вас в коде уже была объявлена функция padezh или Вы мою функцию по ошибке дважды объявили. Вы все padezh в моём коде замените например на padezh2 и если вы не продублировали данный код по ошибке несколько раз - будет Вам счастье.

Да два раза было подключено :) а теперь выводит просто дату из БД и всё :(
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343772
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПрограмёрМаша ипропущено...


так вот задача лежит из-за падежа, Fatal error: Cannot redeclare padezh() (previously declared in
показывает ошибку в этой строчке function padezh($num, $p1, $p2, $p5){

Хм. Вам бы учебничек по пхп какой-нить почитать ;). Вообщем или у Вас в коде уже была объявлена функция padezh или Вы мою функцию по ошибке дважды объявили. Вы все padezh в моём коде замените например на padezh2 и если вы не продублировали данный код по ошибке несколько раз - будет Вам счастье.

Ура!!!! Работает!!!! Спасибо!!!!!!!!!!!!!!!!!!!!!!!
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343774
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маша и,

ну вот... видите... разобрались. А выводило просто дату из-за того, что все действия были древние :)
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343791
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПрограмёрМаша и,

ну вот... видите... разобрались. А выводило просто дату из-за того, что все действия были древние :)

ага, я 400 дней поставила :)
Я так понимаю что в этой части кода периоды, а как их менять?
Код: php
1.
2.
3.
4.
5.
6.
7.
elseif($aseconds<3600){
    return ($seconds<0 ? "через " : "").(round($aseconds / 60) % 60)." ".padezh(round($aseconds / 60) % 60, "минуту", "минуты", "минут").($seconds>0 ? " назад" : "");
  }
  elseif($aseconds<18000){
    return ($seconds<0 ? "через " : "").(round($aseconds / 3600) % 24)." ".padezh(round($aseconds / 3600) % 24, "час", "часа", "часов").($seconds>0 ? " назад" : "");
  }
  elseif(($days = abs(strtotime(date("Y-m-d", $sd))-strtotime(date("Y-m-d", $snow)))/3600/24 >> 0)<3){
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343940
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маша и,

в условиях стоят секунды (то есть количество секунд от/до события). Если надо, что бы не до 5 часов писало в часах, а до 8 - поставьте нужную циферку и всё. А всё остальное никак не меняется... часы и минуты всё-таки стандартные величины .
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38343962
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПрограмёрМаша и,

в условиях стоят секунды (то есть количество секунд от/до события). Если надо, что бы не до 5 часов писало в часах, а до 8 - поставьте нужную циферку и всё. А всё остальное никак не меняется... часы и минуты всё-таки стандартные величины .

Понятно, а как сделать чтобы в таком формате показывало ("7 минут 51 секунд назад")?
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38344137
DateTime
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторНапишите работающий вариант, сравним.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
        $phrases = array(
            'patterns' => array(
                array(
                    'Сегодня в %s',
                    'Завтра, %s',
                    'Послезавтра, %s',
                    'Через %s',
                    'Через %s %s'
                ),
                array(
                    'Сегодня, %s',
                    'Вчера, %s',
                    'Позавчера, %s',
                    '%s назад',
                    '%s %s назад'
                )),
            'hours' => array(
                'час',
                'часа',
                'часов'
            ),
            'minutes' => array(
                'минуту',
                'минуты',
                'минут'
        ));
                        
        $date = \DateTime::createFromFormat('Y/m/d H:i:s', '2013/07/25 14:43:13');
        $now = new \DateTime();
        
        $formatDateDiff = function ($interval, $phrases) use ($date, $now) {
                        
                    $declension = function($number, $titles) {                        
                        $cases = array (2, 0, 1, 1, 1, 2);  
                        return $number . ' ' . $titles[($number%100 > 4 && $number%100 < 20) 
                            ? 2 : $cases[min($number%10, 5)]];
                    };
                    
                    $diffYears  = abs($date->format('y') - $now->format('y')); 
                    $diffMonths = abs($date->format('m') - $now->format('m'));
                    $diffDays   = abs($date->format('d') - $now->format('d'));                        
                    $patterns   = $phrases['patterns'][$interval->invert];
                    
                    if (!$diffYears && !$diffMonths) {
                        switch ($diffDays) {
                            case 0:
                                switch ($interval->h) {
                                    case 0:
                                        return sprintf($patterns[3],
                                                $declension($interval->i, $phrases['minutes'])
                                        );
                                    case 1:
                                        return sprintf($patterns[4], 
                                                $declension($interval->h, $phrases['hours']),
                                                $declension($interval->i, $phrases['minutes'])
                                        );
                                }
                                return sprintf($patterns[0], 
                                        $date->format('H:i:s')
                                );
                            case 1:
                                return sprintf($patterns[1], 
                                        $date->format('H:i:s')
                                );
                            case 2:
                                return sprintf($patterns[2],
                                        $date->format('H:i:s')
                                );
                        }
                    }
                    return $date->format('Y/m/d H:i:s');
                };

        var_dump($formatDateDiff($now->diff($date), $phrases));



Успехов!
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38344168
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DateTimeавторНапишите работающий вариант, сравним.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
        $phrases = array(
            'patterns' => array(
                array(
                    'Сегодня в %s',
                    'Завтра, %s',
                    'Послезавтра, %s',
                    'Через %s',
                    'Через %s %s'
                ),
                array(
                    'Сегодня, %s',
                    'Вчера, %s',
                    'Позавчера, %s',
                    '%s назад',
                    '%s %s назад'
                )),
            'hours' => array(
                'час',
                'часа',
                'часов'
            ),
            'minutes' => array(
                'минуту',
                'минуты',
                'минут'
        ));
                        
        $date = \DateTime::createFromFormat('Y/m/d H:i:s', '2013/07/25 14:43:13');
        $now = new \DateTime();
        
        $formatDateDiff = function ($interval, $phrases) use ($date, $now) {
                        
                    $declension = function($number, $titles) {                        
                        $cases = array (2, 0, 1, 1, 1, 2);  
                        return $number . ' ' . $titles[($number%100 > 4 && $number%100 < 20) 
                            ? 2 : $cases[min($number%10, 5)]];
                    };
                    
                    $diffYears  = abs($date->format('y') - $now->format('y')); 
                    $diffMonths = abs($date->format('m') - $now->format('m'));
                    $diffDays   = abs($date->format('d') - $now->format('d'));                        
                    $patterns   = $phrases['patterns'][$interval->invert];
                    
                    if (!$diffYears && !$diffMonths) {
                        switch ($diffDays) {
                            case 0:
                                switch ($interval->h) {
                                    case 0:
                                        return sprintf($patterns[3],
                                                $declension($interval->i, $phrases['minutes'])
                                        );
                                    case 1:
                                        return sprintf($patterns[4], 
                                                $declension($interval->h, $phrases['hours']),
                                                $declension($interval->i, $phrases['minutes'])
                                        );
                                }
                                return sprintf($patterns[0], 
                                        $date->format('H:i:s')
                                );
                            case 1:
                                return sprintf($patterns[1], 
                                        $date->format('H:i:s')
                                );
                            case 2:
                                return sprintf($patterns[2],
                                        $date->format('H:i:s')
                                );
                        }
                    }
                    return $date->format('Y/m/d H:i:s');
                };

        var_dump($formatDateDiff($now->diff($date), $phrases));



Успехов!

А в моем варианте так правильно будет использовать?
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
$res = mysqlQuery("SELECT `id`, `date`, `name` 
                           FROM `user`  
                           WHERE `date` >= DATE_SUB(CURRENT_DATE, INTERVAL 2 DAY) ORDER BY `date` DESC");
if(mysql_num_rows($res) > 0)
		{ 
             while ($row = mysql_fetch_assoc($res))
               {
              $row['id'] = $row['id'];
              $row['date'] = $formatDateDiff['date'];
              $row['name'] = $row['name'];
              $top .= parseTpl($tpl, $row);
               } 
       }
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38344172
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DateTime,

первого числа Ваш скрипт будет работать неверно (как и второго и 31-ого и 30-ого)... Не очень то круто.

А вот если сделать так, что бы всё работало, сложность ещё возрастёт раза в полтора. И тогда Ваш вариант точно будет уступать моему. Хотя кто знает, если чисто по спортивному хотите доказать, что правы, я буду только рад посмотреть Ваш рабочий вариант и вместе с Вами их сравнить.

Успехов!

Маша и,
Код: php
1.
2.
3.
4.
5.
6.
return (
  ($seconds<0 ? "через " : "")
  .(round($aseconds / 60) % 60)." ".padezh(round($aseconds / 60) % 60, "минуту", "минуты", "минут")." "
  .($aseconds % 60)." ".padezh($aseconds % 60, "секунду", "секунды", "секунд")
  .($seconds>0 ? " назад" : "")
);



Разделил в несколько строк, что бы было легче понять что где ;)
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38344199
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПрограмёрDateTime,

первого числа Ваш скрипт будет работать неверно (как и второго и 31-ого и 30-ого)... Не очень то круто.

А вот если сделать так, что бы всё работало, сложность ещё возрастёт раза в полтора. И тогда Ваш вариант точно будет уступать моему. Хотя кто знает, если чисто по спортивному хотите доказать, что правы, я буду только рад посмотреть Ваш рабочий вариант и вместе с Вами их сравнить.

Успехов!

Маша и,
Код: php
1.
2.
3.
4.
5.
6.
return (
  ($seconds<0 ? "через " : "")
  .(round($aseconds / 60) % 60)." ".padezh(round($aseconds / 60) % 60, "минуту", "минуты", "минут")." "
  .($aseconds % 60)." ".padezh($aseconds % 60, "секунду", "секунды", "секунд")
  .($seconds>0 ? " назад" : "")
);



Разделил в несколько строк, что бы было легче понять что где ;)

Афигенно всё работает ещё раз спасибо огромное!!!!
А как сделать чтобы за последний час? А то я меняю в запросе на INTERVAL 1 HOUR, а оно показывает событие 4 часа назад.
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38344213
DateTime
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторпервого числа Ваш скрипт будет работать неверно (как и второго и 31-ого и 30-ого)...
что простите?! ;)
автор по спортивному хотите доказать, что правы,
я вообще никому ничего доказывать не собирался!
просто твой вариант мне претит по определению 14618093 - ме думает, кроме тебя там мало кто что понимает... уж прости...
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38344215
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Маша иПрограмёрDateTime,

первого числа Ваш скрипт будет работать неверно (как и второго и 31-ого и 30-ого)... Не очень то круто.

А вот если сделать так, что бы всё работало, сложность ещё возрастёт раза в полтора. И тогда Ваш вариант точно будет уступать моему. Хотя кто знает, если чисто по спортивному хотите доказать, что правы, я буду только рад посмотреть Ваш рабочий вариант и вместе с Вами их сравнить.

Успехов!

Маша и,
Код: php
1.
2.
3.
4.
5.
6.
return (
  ($seconds<0 ? "через " : "")
  .(round($aseconds / 60) % 60)." ".padezh(round($aseconds / 60) % 60, "минуту", "минуты", "минут")." "
  .($aseconds % 60)." ".padezh($aseconds % 60, "секунду", "секунды", "секунд")
  .($seconds>0 ? " назад" : "")
);



Разделил в несколько строк, что бы было легче понять что где ;)

Афигенно всё работает ещё раз спасибо огромное!!!!
А как сделать чтобы за последний час? А то я меняю в запросе на INTERVAL 1 HOUR, а оно показывает событие 4 часа назад.

Всё в порядке, отмена, это делается так WHERE `date` > NOW() - INTERVAL 1 HOUR

Спасибо Программёр :-) !!!
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38344229
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маша и,

в mysql вместо CURRENT_DATE используйте NOW() и всё заработает ;)

DateTimeавторпервого числа Ваш скрипт будет работать неверно (как и второго и 31-ого и 30-ого)...
что простите?! ;)
автор по спортивному хотите доказать, что правы,
я вообще никому ничего доказывать не собирался!
просто твой вариант мне претит по определению 14618093 - ме думает, кроме тебя там мало кто что понимает... уж прости...

Ну, первое моё предложение вроде понятное )) если событие произойдёт 31-ого марта, а вы будете об этом смотреть 1-ого апреля, то вместо вчера (или час назад, если разница в час) Вы получите просто обычную дату, что не соответствует условиям задачи.

По поводу того, что мой вариант непонятен - мне Ваш вариант также непонятен (точнее малопонятен и надо вдумываться). Просто видите какая штука, у нас манера программировать разная, а потому и понимать код друг-друга нам сложно.
Уж как есть :)

Однако в Вашем скрипте описанный мной случай будет проявляться не только на границе месяцев, но и на границе дней (только там вместо "5 минут назад" будет писать "вчера в ...") :)
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38344255
DateTime
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторОднако в Вашем скрипте описанный мной случай будет проявляться не только на границе месяцев
я подумаю! ;)
авторПо поводу того, что мой вариант непонятен - мне Ваш вариант также непонятен (точнее малопонятен и надо вдумываться).
без комментариев! мне за тобой очень не хотелось бы что-то исправлять...
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38344346
DateTime
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторНу, первое моё предложение вроде понятное )) если событие произойдёт 31-ого марта, а вы будете об этом смотреть 1-ого апреля, то вместо вчера (или час назад, если разница в час) Вы получите просто обычную дату, что не соответствует условиям задачи.
fixed
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
$phrases = array(
            'patterns' => array(
                array(
                    'Сегодня в %s',
                    'Завтра, %s',
                    'Послезавтра, %s',
                    'Через %s',
                    'Через %s %s'
                ),
                array(
                    'Сегодня, %s',
                    'Вчера, %s',
                    'Позавчера, %s',
                    '%s назад',
                    '%s %s назад'
                )),
            'hours' => array(
                'час',
                'часа',
                'часов'
            ),
            'minutes' => array(
                'минуту',
                'минуты',
                'минут'
        ));
                        
        $date = \DateTime::createFromFormat('Y/m/d H:i:s', '2013/07/25 14:43:13');
        $now = new \DateTime();
        
        $formatDateDiff = function ($interval, $phrases) use ($date, $now) {
                        
                    $declension = function($number, $titles) {                        
                        $cases = array (2, 0, 1, 1, 1, 2);  
                        return $number . ' ' . $titles[($number%100 > 4 && $number%100 < 20) 
                            ? 2 : $cases[min($number%10, 5)]];
                    };
                                      
                    $diffDays   = abs($date->format('d') - $now->format('d'));                        
                    $patterns   = $phrases['patterns'][$interval->invert];
                    
                    if (!$interval->y && !$interval->m) {
                        switch ($diffDays) {
                            case 0:
                                switch ($interval->h) {
                                    case 0:
                                        return sprintf($patterns[3],
                                                $declension($interval->i, $phrases['minutes'])
                                        );
                                    case 1:
                                        return sprintf($patterns[4], 
                                                $declension($interval->h, $phrases['hours']),
                                                $declension($interval->i, $phrases['minutes'])
                                        );
                                }
                                return sprintf($patterns[0], 
                                        $date->format('H:i:s')
                                );
                            case 1:
                                return sprintf($patterns[1], 
                                        $date->format('H:i:s')
                                );
                            case 2:
                                return sprintf($patterns[2],
                                        $date->format('H:i:s')
                                );
                        }
                    }
                    return $date->format('Y/m/d H:i:s');
                };

        var_dump($formatDateDiff($now->diff($date), $phrases));


авторно и на границе дней (только там вместо "5 минут назад" будет писать "вчера в ...") :)
won't fix - это было реально ВЧЕРА!!!
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38344377
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DateTimeавторно и на границе дней (только там вместо "5 минут назад" будет писать "вчера в ...") :)
won't fix - это было реально ВЧЕРА!!!

Фактически да. Но задача предусматривает иное поведение (так же как и с месяцем, который поправили ;) ). Вот с днями то как-раз и весь гемор, когда условия начинают переплитаться. Хотя, вроде я видел что-то типа $interval->hour (именно разница в часах), которая облегчит задачу, но однако же всёровно надо будет ещё условия дописывать
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38344445
DateTime
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторВот с днями то как-раз и весь гемор,
весь гемор с вчера сегодня и завтра - исправленный код, кстати :), тоже не очень! рабочий...
если откинуть стёб с этим вчера сегодня, то алгоритм вообще банален
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
$phrases = array(
            'patterns' => array(
                array(                    
                    'Через %s',
                    'Через %s %s'
                ),
                array(                   
                    '%s назад',
                    '%s %s назад'
                )),
            'hours' => array(
                'час',
                'часа',
                'часов'
            ),
            'minutes' => array(
                'минуту',
                'минуты',
                'минут'
        ));
                        
        $date = \DateTime::createFromFormat('Y/m/d H:i:s', '2013/07/25 14:43:13');
        $now = new \DateTime();
        
        $formatDateDiff = function ($interval, $phrases) use ($date, $now) {
                        
                    $declension = function($number, $titles) {                        
                        $cases = array (2, 0, 1, 1, 1, 2);  
                        return $number . ' ' . $titles[($number%100 > 4 && $number%100 < 20) 
                            ? 2 : $cases[min($number%10, 5)]];
                    }; 
                    
                    $patterns   = $phrases['patterns'][$interval->invert];
                    
                    if (!$interval->y && !$interval->m && !$interval->d) {                        
                                switch ($interval->h) {
                                    case 0:
                                        return sprintf($patterns[0],
                                                $declension($interval->i, $phrases['minutes'])
                                        );
                                    default:
                                        return sprintf($patterns[1], 
                                                $declension($interval->h, $phrases['hours']),
                                                $declension($interval->i, $phrases['minutes'])
                                        );
                                }                                
                    }
                    return $date->format('Y/m/d H:i:s');
                };

        var_dump($formatDateDiff($now->diff($date), $phrases));


даже ещё проще, просто правил прямо здесь (уже побоялся накосячить ;)!!!
авторНо задача предусматривает иное поведение
;)!!!
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38344469
DateTime
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И кстати, смотрю на этом форуме предыдущее сообщение сегодня, 22:55
А по факту у меня на компе даже сейчас 22:31!!! :)
UTC + 02:00 наверное играет роль - тч можно ещё и об этом подумать - может тупо js? ;)))
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38344477
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DateTime,

Может лучше так тогда (если без вчера, завтра, послезавтра и т.д.)?
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
function padezh($num, $p1, $p2, $p5){
  $x = $num % 100;
  $y = ($x % 10)-1;
  $res = ($x/10)>>0==1 ? $p5 : ($y&12 ? $p5 : ($y&3 ? $p2 : $p1));
  return $res;
}

function dateDiff($d, $now = null, $timezone = null){
  if ($now===null) $now = date("Y-m-d H:i:s");
  $snow = strtotime($now);
  $sd = strtotime($d);

  $tz = date_default_timezone_get(); //запоминаем часовой пояс до выполнения функции
  if ($timezone!==null) date_default_timezone_set($timezone); //устанавливаем часовой пояс клиента

  if (date("Y-m-d", $sd)!=date("Y-m-d", $snow)) return date("Y-m-d H:i", $sd);
  
  $seconds = $snow-$sd;
  $aseconds = abs($seconds);

  $res = ($seconds<0 ? "через " : "");

  if ($aseconds>3600){
    $res .= (round($aseconds / 3600) % 24)." ".padezh(round($aseconds / 3600) % 24, "час", "часа", "часов")." ";
  }
  $res .= (round($aseconds / 60) % 60)." ".padezh(round($aseconds / 60) % 60, "минуту", "минуты", "минут");

  $res .= ($seconds>0 ? " назад" : "");

  if ($timezone!==null) date_default_timezone_set($tz); //возвращаем часовой пояс

  return $res;
}



Уже с учётом часового пояса.
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38344527
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
def padezh(num, p1, p2, p5):
  x = num % 100;
  y = (x % 10)-1;
  res = p5 if x//10==1 else (p5 if y&12 else (p2 if y&3 else p1));
  return res;

def dateDiff(d):
  dt = datetime.strptime(d, "%Y-%m-%d %H:%M:%S")

  if(dt.strftime("%Y-%m-%d")!=datetime.today().strftime("%Y-%m-%d")):
    return datetime.strptime(d, "%Y-%m-%d %H:%M")
  else:

    dif = datetime.today()-dt
    res = "" if dif.days>=0 else "через ";

    hours = abs(dif.days*24*60 + dif.seconds//60)//60
    if(hours>0):
      res += str(hours)+" "+padezh(hours, "час", "часа", "часов")+" "

    minutes = abs(dif.days*24*60 + dif.seconds//60) % 60
    res += str(minutes)+" "+padezh(abs(minutes, "минута", "минуты", "минут")

    res += "" if dif.days<0 else " назад";

    return res



Даже не знаю почему, но на питоне любой мой код как-то красивее смотрится (уже не первый перевожу в целях самообучения новому языку). Видимо язык под таких как я создан . Только вот авторы сайта почему-то подсветку синтаксиса этому языку неудачную сделали... Ну да ладно... разобрать можно, если присмотреться.
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38344596
DateTime
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Желаю тебе поработать в команде!
+ применить свой код к различным культурам - рус\eng - например! ;)
14619152 - вообще непонял про часовой пояс! ;)
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38344609
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DateTimeЖелаю тебе поработать в команде!
+ применить свой код к различным культурам - рус\eng - например! ;)
14619152 - вообще непонял про часовой пояс! ;)
В точку . Я сейчас работаю в команде и пишу сайт школы английского языка (разумеется мультиязычный)
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38344634
DateTime
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ты себя то не обманывай...
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38344638
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DateTimeТы себя то не обманывай...

?! Поясни, раз начал.
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38344656
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Модератор:
DateTime ,
Програмёр ,
предлагаю потрепаться в другом месте.
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38345044
DateTime
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
походу добил ;)
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
$phrases = array(
            'patterns' => array(
                array(               
                    'Осталось меньше минуты',
                    'Осталось %s %s',                   
                    'Сегодня в %s',
                    'Завтра, %s',
                    'Послезавтра, %s'
                ),
                array(             
                    'Прошло меньше минуты',
                    'Прошло %s %s',                    
                    'Сегодня, %s',
                    'Вчера, %s',
                    'Позавчера, %s'
                )                
            ),
            'hours' => array(
                'час',
                'часа',
                'часов'
            ),
            'minutes' => array(
                'минута',
                'минуты',
                'минут'
            ),
            'seconds' => array(
                'секунда',
                'секунды',
                'секунд'
        ));
                                
        $formatDateDiff = function (\DateTime $date, \DateTime $now, array $phrases) {
                        
                    $declension = function($number, $titles) {                        
                        $cases = array (2, 0, 1, 1, 1, 2);  
                        return $number . ' ' . $titles[($number%100 > 4 && $number%100 < 20) 
                            ? 2 : $cases[min($number%10, 5)]];
                    };  
                    $cleanDate      = new \DateTime($date->format('Y-m-d 00:00:00'));
                    $cleanNow       = new \DateTime($now->format('Y-m-d 00:00:00'));
                    $cleanInterval  = $cleanNow->diff($cleanDate);
                    $interval       = $now->diff($date);          
                    $decHours       = $declension($interval->h, $phrases['hours']);
                    $decMinutes     = $declension($interval->i, $phrases['minutes']);
                    $decSeconds     = $declension($interval->s, $phrases['seconds']);
                    $patterns       = $phrases['patterns'][$interval->invert];
                                        
                    if (!$cleanInterval->y && !$cleanInterval->m) {                        
                        switch ($cleanInterval->d) {
                            case 0:
                                if (!$interval->h) {                                    
                                    
                                    if (!$interval->i) return $patterns[0];  
                                    
                                    return sprintf($patterns[1], 
                                            $decMinutes, 
                                            $decSeconds
                                    ); 
                                } 
                                if ($interval->h < 6) {
                                    return sprintf($patterns[1], 
                                            $decHours, 
                                            $decMinutes
                                    );  
                                }    
                                return sprintf($patterns[2], $date->format('H:i'));
                            case 1:
                                return sprintf($patterns[3], $date->format('H:i'));
                            case 2:
                                return sprintf($patterns[4], $date->format('H:i'));
                        }                        
                    }
                    return $date->format(\DATE_ATOM);
                };

        //$date = new \DateTime("@1171502725");
        $date = \DateTime::createFromFormat('Y/m/d H:i:s', '2013/08/01 00:01:13');
        $now = \DateTime::createFromFormat('Y/m/d H:i:s', '2013/07/01 23:59:00');        
                
        var_dump($formatDateDiff($date, $now, $phrases));


функция как бэ не должна напрямую зависеть от культуры рус\eng and etc. + нету желания использовать 'через' 'назад' >хочу< 'осталось' 'прошло' + strtotime - наверное прикольно хавает даты, НО есть мнение что не всевсевсе форматы ей под силу +
авторdate_default_timezone_set — Устанавливает временную зону по умолчанию для всех функций даты/времени в скрипте
вот из таких мелочей и складывается впечатление кто над чем и с кем работает...

vkle - спс что потерпел... ;)
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38345081
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DateTime,

strtotime все нормальные форматы понимает.

date_default_timezone_set - не конструкция языка, а функция... Потому не ВСЕХ функций, а всех тех, которые вызывались после вызова данной функции. проверено ;)

авторвот из таких мелочей и складывается впечатление кто над чем и с кем работает...

Да... складывается... Прошу воздержаться от данного рода заявлений, мы не меня сейчас обсуждаем и не моё или Ваше умение программировать.

vkle, данная тема ещё не перешла в обычный трёп, так как беседа продолжает быть конструктивной (в данном случае мы обсуждаем варианты предоставленные здесь для определения оптимального). Хотя, если считаете иначе (что обсуждать нечего), тогда закрывайте тему... кто же против? :)
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38345329
DateTime
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторstrtotime все нормальные форматы понимает.
http://php.net/manual/ru/function.strtotime.php Замечание:Даты в формате m/d/y или d-m-y разрешают неоднозначность с помощью анализа разделителей их элементов: если разделителем является слэш (/), то дата интерпретируется в американском формате m/d/y, если же разделителем является дефис (-) или точка (.), то подразумевается использование европейского форматаd-m-y.

Чтобы избежать потенциальной неоднозначности, рекомендуется использовать даты в формате стандарта ISO 8601 (YYYY-MM-DD) либо пользоваться функцией DateTime::createFromFormat() там, где это возможно.

Код: php
1.
2.
var_dump(date('l dS \o\f F Y h:i:s A', strtotime('01/12/2013')));
var_dump(date('l dS \o\f F Y h:i:s A', strtotime('01.12.2013')));


авторdate_default_timezone_set - не конструкция языка, а функция...
http://php.net/manual/ru/function.date-default-timezone-set.php
(PHP 5 >= 5.1.0)date_default_timezone_set — Устанавливает временную зону по умолчанию для всех функций даты/времени в скрипте

Код: php
1.
2.
3.
4.
5.
6.
$date = \DateTime::createFromFormat('Y/m/d H:i:s', '2013/08/01 00:01:13');        
var_dump($date);
$date->setTimezone(new \DateTimeZone('Europe/Amsterdam'));
var_dump($date);
//здесь я могу работать с др. датами не опасаясь!, что для них будет временная зона 'Europe/Amsterdam'
//и мне не нужно ничего никуда возвращать!!! if ($timezone!==null) date_default_timezone_set($tz); //возвращаем часовой пояс


авторв данном случае мы обсуждаем варианты предоставленные здесь для определения оптимального
сделай свою функцию не зависящей от культуры рус, сделай свою функцию не зависящей от формата ввода\вывода, используй не глобальные функции, а локальные значения! Возми это за правило при написании кода и я лично сниму перед тобою шляпу!!!
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38345548
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DateTime
походу добил ;)
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
$phrases = array(
            'patterns' => array(
                array(               
                    'Осталось меньше минуты',
                    'Осталось %s %s',                   
                    'Сегодня в %s',
                    'Завтра, %s',
                    'Послезавтра, %s'
                ),
                array(             
                    'Прошло меньше минуты',
                    'Прошло %s %s',                    
                    'Сегодня, %s',
                    'Вчера, %s',
                    'Позавчера, %s'
                )                
            ),
            'hours' => array(
                'час',
                'часа',
                'часов'
            ),
            'minutes' => array(
                'минута',
                'минуты',
                'минут'
            ),
            'seconds' => array(
                'секунда',
                'секунды',
                'секунд'
        ));
                                
        $formatDateDiff = function (\DateTime $date, \DateTime $now, array $phrases) {
                        
                    $declension = function($number, $titles) {                        
                        $cases = array (2, 0, 1, 1, 1, 2);  
                        return $number . ' ' . $titles[($number%100 > 4 && $number%100 < 20) 
                            ? 2 : $cases[min($number%10, 5)]];
                    };  
                    $cleanDate      = new \DateTime($date->format('Y-m-d 00:00:00'));
                    $cleanNow       = new \DateTime($now->format('Y-m-d 00:00:00'));
                    $cleanInterval  = $cleanNow->diff($cleanDate);
                    $interval       = $now->diff($date);          
                    $decHours       = $declension($interval->h, $phrases['hours']);
                    $decMinutes     = $declension($interval->i, $phrases['minutes']);
                    $decSeconds     = $declension($interval->s, $phrases['seconds']);
                    $patterns       = $phrases['patterns'][$interval->invert];
                                        
                    if (!$cleanInterval->y && !$cleanInterval->m) {                        
                        switch ($cleanInterval->d) {
                            case 0:
                                if (!$interval->h) {                                    
                                    
                                    if (!$interval->i) return $patterns[0];  
                                    
                                    return sprintf($patterns[1], 
                                            $decMinutes, 
                                            $decSeconds
                                    ); 
                                } 
                                if ($interval->h < 6) {
                                    return sprintf($patterns[1], 
                                            $decHours, 
                                            $decMinutes
                                    );  
                                }    
                                return sprintf($patterns[2], $date->format('H:i'));
                            case 1:
                                return sprintf($patterns[3], $date->format('H:i'));
                            case 2:
                                return sprintf($patterns[4], $date->format('H:i'));
                        }                        
                    }
                    return $date->format(\DATE_ATOM);
                };

        //$date = new \DateTime("@1171502725");
        $date = \DateTime::createFromFormat('Y/m/d H:i:s', '2013/08/01 00:01:13');
        $now = \DateTime::createFromFormat('Y/m/d H:i:s', '2013/07/01 23:59:00');        
                
        var_dump($formatDateDiff($date, $now, $phrases));


функция как бэ не должна напрямую зависеть от культуры рус\eng and etc. + нету желания использовать 'через' 'назад' >хочу< 'осталось' 'прошло' + strtotime - наверное прикольно хавает даты, НО есть мнение что не всевсевсе форматы ей под силу +
авторdate_default_timezone_set — Устанавливает временную зону по умолчанию для всех функций даты/времени в скрипте
вот из таких мелочей и складывается впечатление кто над чем и с кем работает...

vkle - спс что потерпел... ;)

кстати, сейчас только вдумался и проверил. А чем тут результат отличается от 14618619 ? :) На границе дней как было, так и осталось вместо "осталось 2 минуты" пишет "завтра в 00:01".

По поводу форматов... Вы у себя формат задаёте чётко и если дату вбить неверно получится ошибка. То есть надо вводить валидацию формата, как и в случае с strtotime... И как говорится "тогда зачем платить больше?". Я к тому, что если Вы будете ожидать на входе 1 из 4 вариантов даты: "m/d/y H:i:s", "Y-m-d H:i:s", "m-d-y H:i:s", "Y-m-d H:i", то Вас ожидают точно такие же танцы с бубном как и в моём варианте (а возможно даже и больше). Нет, я понимаю, что Вы написали функцию так, что обработка входа ложится на плечи программиста, который пользует Вашу функцию... Тогда его танцы с бубном ждут в описанном случае.
Про локальные функции вообще не понял. Вернее я то понял, что Вы сказали... Но не понял нафига так делать, если обе функции предполагают, что они будут пользоваться не только в данном случае. А если бы надо было что-то инкапсулировать, я бы радостно класс сбахал бы. Ваша манера написания кода намекает на частое использование js (не говорю что это хорошо или плохо, просто интересно... я прав?).
Разграничивание языков... это да.. отдельная тема. Вопрос не предполагал надобности в этом, потому названия не выносились в отдельный массив. Но сами понимаете, это делается за 5-10 минут... не более.
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38345714
DateTime
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторкстати, сейчас только вдумался и проверил. А чем тут результат отличается от 14618619 ? :) На границе дней как было, так и осталось вместо "осталось 2 минуты" пишет "завтра в 00:01".
14618619 won't fix - это было реально ВЧЕРА!!!

автор Я к тому, что если Вы будете ожидать на входе 1 из 4 вариантов даты: "m/d/y H:i:s", "Y-m-d H:i:s", "m-d-y H:i:s", "Y-m-d H:i", то Вас ожидают точно такие же танцы с бубном как и в моём варианте
Код: php
1.
function (\DateTime $date, \DateTime $now, array $phrases) {}


всё что я ожидаю на входе DateTime и каким образом она туда попадёт меня меньше всего волнует! И это правильно!!!
авторА если бы надо было что-то инкапсулировать, я бы радостно класс сбахал бы.
.........
......
Но сами понимаете, это делается за 5-10 минут... не более.
не сомневаюсь! ;)
да уж сутки как прошли...

P.S. дальше и вправду в этой ветке разговаривать неочем! твой КО! ;)
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38345742
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DateTimeавторкстати, сейчас только вдумался и проверил. А чем тут результат отличается от 14618619 ? :) На границе дней как было, так и осталось вместо "осталось 2 минуты" пишет "завтра в 00:01".
пропущено...


автор Я к тому, что если Вы будете ожидать на входе 1 из 4 вариантов даты: "m/d/y H:i:s", "Y-m-d H:i:s", "m-d-y H:i:s", "Y-m-d H:i", то Вас ожидают точно такие же танцы с бубном как и в моём варианте
Код: php
1.
function (\DateTime $date, \DateTime $now, array $phrases) {}


всё что я ожидаю на входе DateTime и каким образом она туда попадёт меня меньше всего волнует! И это правильно!!!
авторА если бы надо было что-то инкапсулировать, я бы радостно класс сбахал бы.
.........
......
Но сами понимаете, это делается за 5-10 минут... не более.
не сомневаюсь! ;)
да уж сутки как прошли...

P.S. дальше и вправду в этой ветке разговаривать неочем! твой КО! ;)

1. Если в ТЗ написано, что надо так - значит надо так. Вашу логику я понял конечно, но вот я свою функцию за 15 минут поменяю так, что бы моя функция выдавала то же, что и Ваша... А вот Вы свою так не перепишите.
2. Так чего же мы тогда общаемся о "культуре рус/eng". Я тоже жду на вход дату формата "Y-m-d H:i:s" и меня не сильно волнует как она туда попадёт.
3. Искаверкали вырезав середину. за 5-10 минут фразы в массив выносятся, а не классы пишутся... Хотя и вторые не на много дольше пишутся...

Насчёт "КО!" не спешите...
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38345827
DateTime
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор А вот Вы свою так не перепишите.
конечно! http://www.php.net/manual/ru/datetime.gettimestamp.php
автор Я тоже жду на вход дату формата "Y-m-d H:i:s" и меня не сильно волнует как она туда попадёт.
жаль что кроме тебя никто об этом незнает!

Ты действительно всего этого не понимаешь или прикидываешься?
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38345956
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DateTimeавтор А вот Вы свою так не перепишите.
конечно! http://www.php.net/manual/ru/datetime.gettimestamp.php
автор Я тоже жду на вход дату формата "Y-m-d H:i:s" и меня не сильно волнует как она туда попадёт.
жаль что кроме тебя никто об этом незнает!

Ты действительно всего этого не понимаешь или прикидываешься?

Ладно... с ссылкой убедил... Если поставить условие на количество секунд перед if (!$cleanInterval->y && !$cleanInterval->m) и перенести туда часть логики из case 0, то можно быстро переписать.

По поводу второго ("никто об этом не знает"), не соглашусь. Назови я параметр функции не $d, а $dateISO например, любой адекватный читающий понял бы, что ему туда надо записывать )).

В итоге всё же продолжаю выделять в своём алгоритме избавление пользователя (программиста) от проблем с чтением даты (так как перекладываю ответственность на себя, при соблюдении официально принятых форматов даты).

Предлагаю Вам также выделить преимущества Вашего варианта, что бы те, кто всё же проявит интерес и дочитает тему до конца, могли бы определить для себя тот метод, который предпочтительнее им.
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38346090
DateTime
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
http://www.php.net/manual/ru/datetime.construct.php авторПо поводу второго ("никто об этом не знает"), не соглашусь. Назови я параметр функции не $d, а $dateISO например, любой адекватный читающий понял бы, что ему туда надо записывать )).
В итоге всё же продолжаю выделять в своём алгоритме избавление пользователя (программиста) от проблем с чтением даты (так как перекладываю ответственность на себя, при соблюдении официально принятых форматов даты).

time Строка даты/времени. Объяснение корректных форматов дано в Форматы даты и времени.
Если используется аргумент $timezone, то для получения текущего времени в новом объекте достаточно передать NULL в качестве этого аргумента.

Код: php
1.
var_dump(new \DateTime('2013/08/01 23:59:00'));


авторПредлагаю Вам также выделить преимущества Вашего варианта, что бы те, кто всё же проявит интерес и дочитает тему до конца, могли бы определить для себя тот метод, который предпочтительнее им.
для программистов с версии PHP 5.3.0 создали классы для снижения ошибок и отказа от рутины при работе с датой и временем!!!
http://www.php.net/manual/ru/class.datetime.php
однако, некоторые из них не хотят читать мануалы и пишут по старинке - по сути повторяя тот функционал (причём, не всегда рационально), который им уже представлен из коробки!!!

Единственное основание, по которому я бы воспользовался твоими вычислениями! (именно, только! вычислениями, про остальное уже упоминал 14621476 ) - PHP < 5.3.0 - и то с большой осторожностью, тк возможно, необходимый мне функционал тоже, будет уже встроен!!!

P.S. давай закончим на этом? я искренне не хотел тебя задевать и, с самого начала 14615681 давал ссылку на ман, которую ты начинаешь читать только сейчас... Почему ты решил что я устраиваю с тобою соревнования, мне не известно!
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38348276
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А я вот ещё хочу спросить Программёра, на границе времени от 59мин. до 1часа скрипт показывает просто (0 мин, без (1) прсото 0 мин. и всё), а потом показывает 1 час. Как с этим можно побороться?
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38348494
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маша иА я вот ещё хочу спросить Программёра, на границе времени от 59мин. до 1часа скрипт показывает просто (0 мин, без (1) прсото 0 мин. и всё), а потом показывает 1 час. Как с этим можно побороться?

Кстати да... не подумал... надо ВСЕ round заменить на floor. Тем более, если Вы выводите не "1 час назад" или "2 часа назад", а "1 час 38 минут назад", тогда тем более стоит поменять, так как значения будут неверные приходить )) (просто вдруг вспомнил, Вы раньше спрашивали по поводу изменения формата)..

Там происходит так, что 59 мин 35 сек округляется до 60 мин... а если 60 поделить без остатка на 60 - получим 0. ;)
...
Рейтинг: 0 / 0
[PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
    #38349532
Маша и
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПрограмёрМаша иА я вот ещё хочу спросить Программёра, на границе времени от 59мин. до 1часа скрипт показывает просто (0 мин, без (1) прсото 0 мин. и всё), а потом показывает 1 час. Как с этим можно побороться?

Кстати да... не подумал... надо ВСЕ round заменить на floor. Тем более, если Вы выводите не "1 час назад" или "2 часа назад", а "1 час 38 минут назад", тогда тем более стоит поменять, так как значения будут неверные приходить )) (просто вдруг вспомнил, Вы раньше спрашивали по поводу изменения формата)..

Там происходит так, что 59 мин 35 сек округляется до 60 мин... а если 60 поделить без остатка на 60 - получим 0. ;)

Замётано шеф :) работает как часики :) Спасибо!
...
Рейтинг: 0 / 0
58 сообщений из 58, показаны все 3 страниц
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]