Гость
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Узнать разницу в днях между двумя датами. / 23 сообщений из 23, страница 1 из 1
17.05.2010, 13:42
    #36632022
meg17m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать разницу в днях между двумя датами.
Как узнать разницу в днях между 2-мя датами?
Код: plaintext
1.
2.
$tfirm_endtopdate = $record[ 28 ]; //2010-06-01
$nowdate =  date ("Y-m-d"); //2010-05-17
Можно ли как-то легко получить ответ 15 (дней) для этого примера?
...
Рейтинг: 0 / 0
17.05.2010, 14:01
    #36632078
meg17m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать разницу в днях между двумя датами.
Можно решить вот так, кому интересно:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	 function  dateDiff($dformat, $endDate, $beginDate)
	{
		$date_parts1= explode ($dformat, $beginDate);
		$date_parts2= explode ($dformat, $endDate);
		$start_date= gregoriantojd ($date_parts1[ 1 ], $date_parts1[ 2 ], $date_parts1[ 0 ]);
		$end_date= gregoriantojd ($date_parts2[ 1 ], $date_parts2[ 2 ], $date_parts2[ 0 ]);
		 return  $end_date - $start_date;
	}

$vipdaysleft = dateDiff("-", $tfirm_endtopdate, $nowdate);

...
Рейтинг: 0 / 0
17.05.2010, 14:37
    #36632179
The employer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать разницу в днях между двумя датами.
MegaLasta,

А еще лучше привыкать к новому PHP, с человеческим лицом :)

Начиная с 5.2 (а лучше с 5.3):
Код: plaintext
1.
2.
$d =  new  DateTime("2010-06-01");
 echo  $d->diff(  new  DateTime("2010-05-17") )->format("%d");
...
Рейтинг: 0 / 0
18.05.2010, 21:39
    #36635025
AlexNZ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать разницу в днях между двумя датами.
Поддержу товарища The employer, порекомендую так же познакомиться с классами
DateInterval (начиная с 5.3.0),
DatePeriod (начиная с 5.3.0),
DateTimeZone (начиная с 5.2.0).

Появление новых классов повляло на набор функций для работы со временем. Появились функции-алиасы для методов этих классов.

К примеру
date_diff() - алиас для DateTime::diff,
date_interval_format() - алиас для DateInterval::format


Для работы с календарём - расширение Calendar (устанавливается отдельно)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
25.01.2012, 19:01
    #37631536
leva©
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать разницу в днях между двумя датами.
функция diff класса DateTime работает криво как-то (по крайней мере у меня :) )
т.е. если взять 25 января 2010 минус 12 декабря 2009 выдаст 13 дней. Хотя на самом деле это где-то 44 дня.

Я пользуюсь вот такой штукой:

$sDate1 = "2010-01-25"
$sDate2 = "2009-12-12";

echo (strtotime($sDate1) - strtotime($sDate2))/3600/24;

выводит то что надо.
...
Рейтинг: 0 / 0
25.01.2012, 19:23
    #37631579
an0nym
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать разницу в днях между двумя датами.
leva©,

Код: sql
1.
2.
[root@localhost ~]# php -d 'date.timezone=Europe/Moscow' -r '$d = new DateTime("2010-01-25"); printf("%s\n", $d->diff(new DateTime("2009-12-12"))->format("%M-%d"));'
01-13
...
Рейтинг: 0 / 0
25.01.2012, 19:28
    #37631585
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать разницу в днях между двумя датами.
leva©функция diff класса DateTime работает криво как-то (по крайней мере у меня :) )
т.е. если взять 25 января 2010 минус 12 декабря 2009 выдаст 13 дней. Хотя на самом деле это где-то 44 дня.

Я пользуюсь вот такой штукой:

$sDate1 = "2010-01-25"
$sDate2 = "2009-12-12";

echo (strtotime($sDate1) - strtotime($sDate2))/3600/24;

выводит то что надо.

Ну правильно, один месяц и 13 дней)
...
Рейтинг: 0 / 0
01.03.2012, 09:11
    #37685660
dar3000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать разницу в днях между двумя датами.
leva©Я пользуюсь вот такой штукой:
$sDate1 = "2010-01-25"
$sDate2 = "2009-12-12";
echo (strtotime($sDate1) - strtotime($sDate2))/3600/24;
выводит то что надо.

Кстати, подскажите, а с "зеркальным" форматом (день-месяц-ГОД) функция strtotime() корректно работает? Потому что в литературе везде упоминается "практически любое текстовое представление (на английском языке)". На вскидку попробовал strtotime('29.02.2012') и др, пока никаких косяков не заметил.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
19.08.2013, 09:16
    #38370283
sema178
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать разницу в днях между двумя датами.
Вот небольшой скрипт для нахождения разницы дат
...
Рейтинг: 0 / 0
19.08.2013, 11:18
    #38370411
Узнать разницу в днях между двумя датами.
Вот небольшой скрипт
Код: 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'
                ),
                array(             
                    'Прошло меньше минуты',
                    'Прошло %s %s',                    
                    'Сегодня, %s',
                    'Вчера в %s',
                    'Позавчера в %s'
                )                
            ),
            'hours'     => array('час', 'часа', 'часов'),
            'minutes'   => array('минута', 'минуты', 'минут'),
            'seconds'   => array('секунда', 'секунды', 'секунд'),
            'format'    => \DATE_ATOM
        );
                                
        $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)]];
                    };  
                                                            
                    $interval = $now->diff($date); 
                    $patterns = $phrases['patterns'][$interval->invert];
                                   
                    if (!$interval->days) {
                        if (!$interval->h) {
                            if (!$interval->i) return $patterns[0];
                            return sprintf($patterns[1],
                                    $declension($interval->i, $phrases['minutes']),
                                    $declension($interval->s, $phrases['seconds'])
                            );
                        }
                        if ($interval->h <= 5) {
                            return sprintf($patterns[1],
                                    $declension($interval->h, $phrases['hours']),
                                    $declension($interval->i, $phrases['minutes'])
                            );
                        }
                    }
                                                                
                    $interval = $now->setTime(0,0,0)->diff(
                            new \DateTime($date->format('Y-m-d 00:00:00'))
                    );
                                               
                    switch ($interval->days) {
                        case 0:
                            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($phrases['format']);
                };

        //$date = new \DateTime("@1171502725");     
        var_dump($formatDateDiff(
                $date = \DateTime::createFromFormat('Y#m#d\TH:i:sT', 
                        '2013-09-02T14:59:12+03:00'
                ),
                new \DateTime(NULL, $date->getTimezone()), 
                $phrases
        ));



11971027 8785287
Код: php
1.
var_dump(\DateTime::createFromFormat('Y#m#d', '2010-01-25')->diff(new \DateTime('2009-12-12'))->days);
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
12.03.2015, 14:20
    #38902478
sLim80
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать разницу в днях между двумя датами.
Сорри за некропостинг...

Странная вещь:
$diff=(strtotime('2015-04-29')-strtotime('2015-03-27'))/3600/24;
print $diff;
Возвращает 32.958333333333

$diff=(strtotime('29.04.2015')-strtotime('27.03.2015'))/3600/24;
аналогично.

Самое интересное, что с различными другими датами выводит целое нормальное число.

Как вариант чисто для собственного развития :) без классов сделал такой вариант, не зависящий от внутренних функций php:
$tempday=$start;$t=1;
while ($tempday<>$end) {$t++;$tempday=date("d.m.Y",strtotime("+1 day",strtotime($tempday)));}
print $t;
//формат дат d.m.Y, с таким циклом есть риск подвесить скрипт если не правильно даты подставить
...
Рейтинг: 0 / 0
12.03.2015, 14:42
    #38902506
-k2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать разницу в днях между двумя датами.
sLim80,

для внутреннего развития было бы полезнее почитать
http://php.net/manual/ru/datetime.diff.php

задача "не зависеть от внутренних функций php" для программиста php
не кажется мне многообещающей или хоть сколько-нибудь полезной
...
Рейтинг: 0 / 0
12.03.2015, 15:05
    #38902543
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать разницу в днях между двумя датами.
sLim80Странная вещь:
$diff=(strtotime('2015-04-29')-strtotime('2015-03-27'))/3600/24;
print $diff;
Возвращает 32.958333333333Странная у Вас система. Или странная сборка интерпретатора ЯП. Проверил на нескольких машинах с разными версиями PHP - результат одинаков:
Код: php
1.
2.
$ php -r "echo (strtotime('2015-04-29')-strtotime('2015-03-27'))/3600/24;"
33
...
Рейтинг: 0 / 0
12.03.2015, 16:45
    #38902758
MikkiMouse
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать разницу в днях между двумя датами.
vkle,

Да нет, это норм поведение видимо
Код: php
1.
2.
3.
4.
5.
6.
7.
$ php -r "echo (strtotime('2015-04-29')-strtotime('2015-03-27'))/3600/24;"
32.958333333333

$ php -v
PHP 5.5.15 (cli) (built: Aug  7 2014 01:55:14) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
...
Рейтинг: 0 / 0
12.03.2015, 17:11
    #38902815
kunaksergey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать разницу в днях между двумя датами.
MikkiMousevkle,

Да нет, это норм поведение видимо
Код: php
1.
2.
3.
4.
5.
6.
7.
$ php -r "echo (strtotime('2015-04-29')-strtotime('2015-03-27'))/3600/24;"
32.958333333333

$ php -v
PHP 5.5.15 (cli) (built: Aug  7 2014 01:55:14) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies


метки времени откуда-то берут еще один час(3600)
strtotime('2015-04-29')-strtotime('2015-03-27')=(2847600+3600)/3600/24=33
...
Рейтинг: 0 / 0
12.03.2015, 17:31
    #38902867
-k2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать разницу в днях между двумя датами.
kunaksergey,

php -r "echo ((gmmktime(0,0,0,04,29,2015)-gmmktime(0,0,0,03,27,2015))/3600/24)"

=33 и для 5.3.3 и для 5.6.3
...
Рейтинг: 0 / 0
12.03.2015, 17:35
    #38902881
-k2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать разницу в днях между двумя датами.
либо так если очень уж хочется
$ php -r "echo (strtotime('2015-04-29 UTC')-strtotime('2015-03-27 UTC'))/3600/24;"
33

$php -v
PHP 5.6.3 (cli) (built: Nov 12 2014 17:18:08)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
29.08.2016, 06:07
    #39299303
sLim80
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать разницу в днях между двумя датами.
Вопросы по работе с датами помоему никогда не кончатся :)
Искал ответы и наткнулся на свой же прошлогодний пост.
Если кому интересно, то при нахождении разницы в днях между датами используя diff нужно использовать формат %a - почему-то во многих форумах люди пишут ошибочно %d
%a - общее количество дней в качестве результата выполнения DateTime::diff()
%d показывает правильно только если разница между датами меньше 1 месяца (если больше, то кол-во месяцев будет сидеть в %m)
Вот правильный пример:
$date1 = DateTime::createFromFormat('d.m.Y', '15.10.2016');
$date2 = DateTime::createFromFormat('d.m.Y', '20.12.2016');
$diff=$date1->diff($date2)->format("%a");
Заодно сразу натолкнулся на баг. На Windows платформе с php ниже 5.3.2 результат всегда 6015
https://bugs.php.net/bug.php?id=51184
Будьте внимательны и аккуратны )
...
Рейтинг: 0 / 0
29.08.2016, 11:32
    #39299424
sLim80
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать разницу в днях между двумя датами.
Судя по всему прибавка часа описанная выше связана с переходом на зимнее/летнее время.

У кого старый PHP (возможно работающий в среде Windows) некорректно возвращает разницу в датах при использовании diff (всегда 6015) сделал функцию, в ней мы уходим от strtotime и mktime (она работает с учётом часовых поясов, что тоже зачастую приводит к непредсказуемым результатам)

//разница в днях между двумя датами в формате 'DD.MM.YYYY' без учёта часовых поясов и переходов на летнее время
function DateDiff($a1,$a2)
{
$d1=explode('.',$a1);$d2=explode('.',$a2);
return (gmmktime(0,0,0,$d1[1],$d1[0],$d1[2])-gmmktime(0,0,0,$d2[1],$d2[0],$d2[2]))/3600/24;
};

проверил на 3000+ интервалов дат - всегда возвращает целое и адекватное число, в отличие от изложенных выше вариантов на всех версиях php и на разных платформах.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
18.10.2017, 13:22
    #39538015
новый456
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать разницу в днях между двумя датами.
А подскажите новичку зачем вообще нужна Разница между двумя датами python?
...
Рейтинг: 0 / 0
18.10.2017, 13:57
    #39538048
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать разницу в днях между двумя датами.
новый456,
быват что нужно, а питон тут не причем
...
Рейтинг: 0 / 0
18.10.2017, 14:00
    #39538049
Новый 456
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать разницу в днях между двумя датами.
Вы имеете ввиду, вообще в программировании?

Если не сложно можете привести наглядный пример для бестолкового)
...
Рейтинг: 0 / 0
21.10.2017, 07:06
    #39539826
Zhenek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать разницу в днях между двумя датами.
Сообщение написано: 1 день 12 часов назад
или if(с момента чего-то прошло более 2х дней) {}else{}
или До ЧМ по футболу 2018 осталось: хх дней хх часов хх минут
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Узнать разницу в днях между двумя датами. / 23 сообщений из 23, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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