powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Узнать разницу в днях между двумя датами.
23 сообщений из 23, страница 1 из 1
Узнать разницу в днях между двумя датами.
    #36632022
Фотография meg17m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как узнать разницу в днях между 2-мя датами?
Код: plaintext
1.
2.
$tfirm_endtopdate = $record[ 28 ]; //2010-06-01
$nowdate =  date ("Y-m-d"); //2010-05-17
Можно ли как-то легко получить ответ 15 (дней) для этого примера?
...
Рейтинг: 0 / 0
Узнать разницу в днях между двумя датами.
    #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
Узнать разницу в днях между двумя датами.
    #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
Узнать разницу в днях между двумя датами.
    #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
Период между сообщениями больше года.
Узнать разницу в днях между двумя датами.
    #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
Узнать разницу в днях между двумя датами.
    #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
Узнать разницу в днях между двумя датами.
    #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
Узнать разницу в днях между двумя датами.
    #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
Период между сообщениями больше года.
Узнать разницу в днях между двумя датами.
    #38370283
sema178
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот небольшой скрипт для нахождения разницы дат
...
Рейтинг: 0 / 0
Узнать разницу в днях между двумя датами.
    #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
Период между сообщениями больше года.
Узнать разницу в днях между двумя датами.
    #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
Узнать разницу в днях между двумя датами.
    #38902506
Фотография -k2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sLim80,

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

задача "не зависеть от внутренних функций php" для программиста php
не кажется мне многообещающей или хоть сколько-нибудь полезной
...
Рейтинг: 0 / 0
Узнать разницу в днях между двумя датами.
    #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
Узнать разницу в днях между двумя датами.
    #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
Узнать разницу в днях между двумя датами.
    #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
Узнать разницу в днях между двумя датами.
    #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
Узнать разницу в днях между двумя датами.
    #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
Период между сообщениями больше года.
Узнать разницу в днях между двумя датами.
    #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
Узнать разницу в днях между двумя датами.
    #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
Период между сообщениями больше года.
Узнать разницу в днях между двумя датами.
    #39538015
новый456
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А подскажите новичку зачем вообще нужна Разница между двумя датами python?
...
Рейтинг: 0 / 0
Узнать разницу в днях между двумя датами.
    #39538048
rema174
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
новый456,
быват что нужно, а питон тут не причем
...
Рейтинг: 0 / 0
Узнать разницу в днях между двумя датами.
    #39538049
Новый 456
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы имеете ввиду, вообще в программировании?

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


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