powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
25 сообщений из 58, страница 2 из 3
[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
25 сообщений из 58, страница 2 из 3
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PHP+MSQL]Помогите ( 5 мин. назад 10 мин. назад и т.д.)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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