Php как сравнить две даты

Сравнение дат в PHP с помощью функции StrToTime ()

В PHP можно легко создать удобочитаемую дату или время, используя функцию Date() . Эта функция принимает два аргумента: допустимый формат даты и метку времени Unix ( если ее не указывать, функция возвратит текущую дату/время ).

Пример

Приведенный выше пример прекрасно подходит для отображения дат и времени. Но когда дело доходит до PHP сравнения дат, использовать удобные для чтения строки — не самый надежный способ. Намного эффективнее сравнить временные метки. Метка времени Unix содержит количество секунд между 1 января 1970 00:00:00 GMT и указанным временем. Это означает, что можно сравнивать даты вплоть до секунд.

Чтобы использовать функцию date() для возврата конкретной даты необходима метка времени, так что сначала потребуется создать ее. Это можно сделать с помощью функций mktime() или strotime() . Обе функции возвращают метку времени Unix , но при этом принимают различные аргументы.

Функция mktime() требует, чтобы дата и время были переданы ей в виде отдельных сегментов ( часы, минуты, секунды, месяц, день, год ):

В свою очередь функция strtotime() может преобразовать текстовое представление даты/времени в метку времени:

Если при PHP сравнении даты с текущей функция strtotime() получает дату/время, в которых день и месяц располагаются перед годом, эта запись будет интерпретироваться по-разному, в зависимости от используемого разделителя. При использовании косой черты в качестве разделителя функция возвратит метку времени в американском формате ( м/д/г ). При использовании в качестве разделителя тире или точки функция возвратит метку в европейском формате ( д-м-г ).

Как можно увидеть ниже, первая метка времени отличается от двух последних:

Функции mktime() и strtotime() возвращают одинаковый результат. Часто текстовое представление даты и времени (‘ 2016-01-01 ‘) хранится в базе данных и считывается из нее через HTML-форму . Например, при помощи библиотеки jQuery datepicker , которая идеально подходит для использования функции strtotime() .

Прежде чем осуществлять сравнение двух дат в PHP , важно убедиться, что временные метки созданы с помощью одного и того же формата. Можно воспользоваться функцией mktime() . Ее преимущество заключается в том, что она намного строже в отношении передаваемой ей даты или время.

Важным преимуществом использования функции strtotime() является гибкость и простота, с которой можно добавить время или вычесть из него:

Пример, показанный ниже, демонстрирует PHP сравнение даты и операции с использованием функции strtotime() . В нем создается массив дат в заданном диапазоне в соответствии с определенным временным интервалом. Функция print_r() выводит результирующий массив, который выглядит следующим образом:

При сравнении двух дат в PHP внутри цикла while время ( в данном случае семь дней ) добавляется к дате начала и производится проверка, чтобы убедиться больше ли полученная временная метка, чем временная метка даты начала.

Если это не так, новая дата добавляется в массив $DateRange , пока цикл не закончится:

Я использовал оператор switch , чтобы определить несколько различных вариантов временного интервала. Это было сделано для того, чтобы показать, как интуитивные « временные » строки использовались для управления временной меткой с помощью функции strtotime() . В документации по PHP приводятся дополнительные примеры.

Источник

DateTime::diff

DateTimeInterface::diff

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

DateTime::diff — DateTimeImmutable::diff — DateTimeInterface::diff — date_diff — Возвращает разницу между двумя объектами DateTime

Описание

Возвращает разницу между двумя объектами DateTimeInterface.

Список параметров

Дата и время для сравнения.

Используется, чтобы вернуть абсолютную разницу.

Возвращаемые значения

DateInterval объект представляет разницу между двумя датами или false в случае возникновения ошибки.

Возвращаемое значение более конкретно представляет интервал для применения к исходному объекту ( $this или $originObject ), чтобы прийти к $targetObject . Этот процесс не всегда обратим.

Примеры

Пример #1 Пример использования DateTime::diff()

Результат выполнения данных примеров:

Пример #2 Сравнение объектов DateTime

С версии PHP 5.2.2 объекты DateTime могут сравниваться при помощи операторов сравнения.

= new DateTime ( «now» );
$date2 = new DateTime ( «tomorrow» );

var_dump ( $date1 == $date2 );
var_dump ( $date1 $date2 );
var_dump ( $date1 > $date2 );
?>

Результат выполнения данного примера:

Смотрите также

  • DateInterval::format() — Форматирует интервал
  • DateTime::add() — Добавляет заданное количество дней, месяцев, лет, часов, минут и секунд к объекту DateTime
  • DateTime::sub() — Вычитает заданное количество дней, месяцев, лет, часов, минут и секунд из времени объекта DateTime

User Contributed Notes 30 notes

It is worth noting, IMO, and it is implied in the docs but not explicitly stated, that the object on which diff is called is subtracted from the object that is passed to diff.

i.e. $now->diff($tomorrow) is positive.

Be careful using:

$date1 = new DateTime(‘now’);
$date2 = new DateTime(‘tomorrow’);

$interval = date_diff($date1, $date2);

echo $interval->format(‘In %a days’);

In some situations, this won’t say «in 1 days», but «in 0 days».
I think this is because «now» is the current time, while «tomorrow» is the current day +1 but at a default time, lets say:

Now: 08:00pm, 01.01.2015
Tomorrow: 00:00am, 02.01.2015

In this case, the difference is not 24 hour, so it will says 0 days.

Better use «today», which should also use a default value like:

Today: 00:00am, 01.01.2015
Tomorrow: 00:00am, 02.01.2015

which now is 24 hour and represents 1 day.

This may sound logical and many will say «of course, this is right», but if you use it in a naiv way (like I did without thinking), you can come to this moment and facepalm yourself.

Conclusion: «Now» is «Today», but in a different clock time, but still the same day!

After wrestling with DateTime::diff for a while it finally dawned on me the problem was both in the formatting of the input string and the formatting of the output.

The task was to calculate the duration between two date/times.

1. Make sure you have a valid date variable. Both of these strings are valid:

$strStart = ‘2013-06-19 18:25’ ;
$strEnd = ’06/19/13 21:47′ ;

?>

2. Next convert the string to a date variable

= new DateTime ( $strStart );
$dteEnd = new DateTime ( $strEnd );

3. Calculate the difference

= $dteStart -> diff ( $dteEnd );

4. Format the output

print $dteDiff -> format ( «%H:%I:%S» );

[Modified by moderator for clarify]

Using the identical (===) comparision operator in different but equal objects will return false

= new DateTime ( ‘2014-04-20’ );
$d = new DateTime ( ‘2014-04-20’ );
var_dump ( $d === $d ); #true
var_dump ( $d === $c ); #false
var_dump ( $d == $c ); #true
?>

If you want to quickly scan through the resulting intervals, you can use the undocumented properties of DateInterval.

The function below returns a single number of years, months, days, hours, minutes or seconds between the current date and the provided date. If the date occurs in the past (is negative/inverted), it suffixes it with ‘ago’.

function pluralize ( $count , $text )
<
return $count . ( ( $count == 1 ) ? ( » $text » ) : ( » $ < text >s» ) );
>

function ago ( $datetime )
<
$interval = date_create ( ‘now’ )-> diff ( $datetime );
$suffix = ( $interval -> invert ? ‘ ago’ : » );
if ( $v = $interval -> y >= 1 ) return pluralize ( $interval -> y , ‘year’ ) . $suffix ;
if ( $v = $interval -> m >= 1 ) return pluralize ( $interval -> m , ‘month’ ) . $suffix ;
if ( $v = $interval -> d >= 1 ) return pluralize ( $interval -> d , ‘day’ ) . $suffix ;
if ( $v = $interval -> h >= 1 ) return pluralize ( $interval -> h , ‘hour’ ) . $suffix ;
if ( $v = $interval -> i >= 1 ) return pluralize ( $interval -> i , ‘minute’ ) . $suffix ;
return pluralize ( $interval -> s , ‘second’ ) . $suffix ;
>
?>

It seems that while DateTime in general does preserve microseconds, DateTime::diff doesn’t appear to account for it when comparing.

= ‘2014-03-18 10:34:09.939’ ;
$val2 = ‘2014-03-18 10:34:09.940’ ;

$datetime1 = new DateTime ( $val1 );
$datetime2 = new DateTime ( $val2 );
echo «

» ;
var_dump ( $datetime1 -> diff ( $datetime2 ));

if( $datetime1 > $datetime2 )
echo «1 is bigger» ;
else
echo «2 is bigger» ;
?>

The var_dump shows that there is no «u» element, and «2 is bigger» is echoed.

To work around this apparent limitation/oversight, you have to additionally compare using DateTime::format.

if( $datetime1 > $datetime2 )
echo «1 is bigger» ;
else if ( $datetime1 -> format ( ‘u’ ) > $datetime2 -> format ( ‘u’ ))
echo «1 is bigger» ;
else
echo «2 is bigger» ;
?>

Warning, there’s a bug on windows platforms: the result is always 6015 days (and not 42. )

Though I found a number of people who ran into the issue of 5.2 and lower not supporting this function, I was unable to find any solid examples to get around it. Therefore I hope this can help some others:

function get_timespan_string ( $older , $newer ) <
$Y1 = $older -> format ( ‘Y’ );
$Y2 = $newer -> format ( ‘Y’ );
$Y = $Y2 — $Y1 ;

$m1 = $older -> format ( ‘m’ );
$m2 = $newer -> format ( ‘m’ );
$m = $m2 — $m1 ;

$d1 = $older -> format ( ‘d’ );
$d2 = $newer -> format ( ‘d’ );
$d = $d2 — $d1 ;

$H1 = $older -> format ( ‘H’ );
$H2 = $newer -> format ( ‘H’ );
$H = $H2 — $H1 ;

$i1 = $older -> format ( ‘i’ );
$i2 = $newer -> format ( ‘i’ );
$i = $i2 — $i1 ;

$s1 = $older -> format ( ‘s’ );
$s2 = $newer -> format ( ‘s’ );
$s = $s2 — $s1 ;

if( $s 0 ) <
$i = $i — 1 ;
$s = $s + 60 ;
>
if( $i 0 ) <
$H = $H — 1 ;
$i = $i + 60 ;
>
if( $H 0 ) <
$d = $d — 1 ;
$H = $H + 24 ;
>
if( $d 0 ) <
$m = $m — 1 ;
$d = $d + get_days_for_previous_month ( $m2 , $Y2 );
>
if( $m 0 ) <
$Y = $Y — 1 ;
$m = $m + 12 ;
>
$timespan_string = create_timespan_string ( $Y , $m , $d , $H , $i , $s );
return $timespan_string ;
>

function get_days_for_previous_month ( $current_month , $current_year ) <
$previous_month = $current_month — 1 ;
if( $current_month == 1 ) <
$current_year = $current_year — 1 ; //going from January to previous December
$previous_month = 12 ;
>
if( $previous_month == 11 || $previous_month == 9 || $previous_month == 6 || $previous_month == 4 ) <
return 30 ;
>
else if( $previous_month == 2 ) <
if(( $current_year % 4 ) == 0 ) < //remainder 0 for leap years
return 29 ;
>
else <
return 28 ;
>
>
else <
return 31 ;
>
>

function create_timespan_string ( $Y , $m , $d , $H , $i , $s )
<
$timespan_string = » ;
$found_first_diff = false ;
if( $Y >= 1 ) <
$found_first_diff = true ;
$timespan_string .= pluralize ( $Y , ‘year’ ). ‘ ‘ ;
>
if( $m >= 1 || $found_first_diff ) <
$found_first_diff = true ;
$timespan_string .= pluralize ( $m , ‘month’ ). ‘ ‘ ;
>
if( $d >= 1 || $found_first_diff ) <
$found_first_diff = true ;
$timespan_string .= pluralize ( $d , ‘day’ ). ‘ ‘ ;
>
if( $H >= 1 || $found_first_diff ) <
$found_first_diff = true ;
$timespan_string .= pluralize ( $H , ‘hour’ ). ‘ ‘ ;
>
if( $i >= 1 || $found_first_diff ) <
$found_first_diff = true ;
$timespan_string .= pluralize ( $i , ‘minute’ ). ‘ ‘ ;
>
if( $found_first_diff ) <
$timespan_string .= ‘and ‘ ;
>
$timespan_string .= pluralize ( $s , ‘second’ );
return $timespan_string ;
>

function pluralize ( $count , $text )
<
return $count . ( ( $count == 1 ) ? ( » $text » ) : ( » $ < text >s» ) );
>
?>

I needed to get the exact number of days between 2 dates and was relying on the this diff function, but found that I was getting a peculiar result with:

= new DateTime ( date ( ‘2011-11-09’ ));
$appt = new DateTime ( date ( ‘2011-12-09’ ));
$days_until_appt = $appt -> diff ( $today )-> d ;
?>

This was returning 0 because it was exactly one month.

I had to end up using :

= $appt -> diff ( $today )-> days ;
?>

to get 30.

Be careful, the behaviour depends on the time zones in a weird way.

function printDiff ( $tz ) <
$d1 = new DateTime ( «2015-06-01» , new DateTimeZone ( $tz ));
$d2 = new DateTime ( «2015-07-01» , new DateTimeZone ( $tz ));
$diff = $d1 -> diff ( $d2 );
print( $diff -> format ( «Year: %Y Month: %M Day: %D» ). PHP_EOL );
>
printDiff ( «UTC» );
printDiff ( «Australia/Melbourne» );
?>

The result is different:

Year: 00 Month: 01 Day: 00
Year: 00 Month: 00 Day: 30

Источник

Сравнение дат

Насколько коректно сравнивать даты таким образом?

Раньше знаю надо было переводить в разные таймштампы, но похоже сейчас, если задать дату именно в таком формате. все должно быть ок, разве не так?

3 ответа 3

Если даты точно в одном формате, то логично сравнивать их как строки, т.е.

Но если нет уверенности, что формат дат одинаковый, то лучше привести их к формату unixtime и сравнивать как числа:

Воспользуйтесь функцией strtotime, т.е. переведите ваши строки, которые вы получаете через date в метку времени unix, т.е. в число int и тогда удобно можно сравнить

Сравнивать как строки даты нельзя не в коем случае, это будет не корректно в случае если у вас:

Выражение $date2 > $date1 ? true : false; Вернет true по той причине, что строки сравниваются посимвольно, соответственно поскольку 5 > 1, строка $date2 > $date1 .

Конечно формат 2011-02-12 вернет корректное сравнение, но это потенциально опасный код.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками php сравнение дата или задайте свой вопрос.

Связанные

Похожие

Подписаться на ленту

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.3.26.38924

Источник

Как сравнить две даты в PHP

как сравнить две даты в php, если даты в формате ’03_01_12′ и ’31_12_11′ .

Я использую этот код:

но это не работает..

13 ответов

вы должны убедиться, что даты допустимы объекты date.

затем вы можете выполнить strtotime() метод, чтобы получить разницу.

ваши скобки не все совпало:

изменить для этого:

функция date_diff () возвращает разницу между двумя объектами DateTime.

Если первая дата перед второй датой положительное количество дней будет возвращено; в противном случае отрицательное количество дней:

выход будет «+272 дня»;

изменение $ date1 = «2014-03-15»

выход будет «-93 дни»

расширение ответа @nevermind, можно использовать DateTime:: createFromFormat: например,

вы можете попробовать что-то вроде:

затем вы можете получить доступ к разнице в днях, таких как этот $dateDiff->d;

Не знаю, что Вы проблема, но:

сравнить результат maketime() для каждого времени

Я знаю, что это поздно, но для дальнейшего использования поместите формат даты в распознанный формат, используя str_replace, тогда ваша функция будет работать. (замените подчеркивание тире)

вы можете конвертировать для целого числа и сравнивать.

$date_1 = дата (‘Ymd’); date_2 $ = ’31_12_2011′;

$date_2 = (int) implode(array_reverse (explode («_», $date_2)));

не отвечая на фактическую проблему OPs, но отвечая только на название. Так как это лучший результат для «сравнения дат в php».

довольно просто использовать объекты Datetime ( v>= 5.3.0 ) и сравнивать их напрямую

Примечание: объект Datetime также может быть создан для предопределенной даты, как показано ниже.

Источник

Строка: Сравнение дат

первое условие отрабатывает нормально,второе отробатывает только «меньше»,то есть этот код не пишет мне ОК,хотя должен

сравнение дат
$h=(int)$rowss; $min=(int)$rowss; $mo=(int)$rowss; $day=(int)$rowss; $year=(int)$rowss;.

Сравнение дат
Привет всем, получаю дату в таком формате И суть в том что мне надо сравнить текущую дату и.

Сравнение дат
Здравствуйте, просмотрел многие справочники и не могу справиться с такой задачей: есть таблица в.

Сравнение двух дат на PHP
В if стоит условие — сравниваются две даты, выраженные переменными пхп, но сравнение почему-то не.

Имеет самое ключевое значение.
Формат даты у него подобран грамотно. Такой формат позволяет полноценно сравнивать даты как строки, без создания объектов или меток.

Согласитесь, это прозвучало как некая идеология.
Даты могут полноценно сравниваться и в строковом виде, но при грамотно сконструированном формате записи.

Если же говорить о личных предпочтениях, то я бы тоже создал метки и сравнивал по ним. Просто потому, что привык так делать.
Но еще раз подчеркну, это не значит, что нельзя выполнять сравнение другими способами.

Ну Вы же читали мое сообщение. Я писал именно о формате, который выбрал автор темы. Опирался я на первое сообщение темы. И проблем в сравнении лично я не заметил.

Вы же пишете о стандарте ISO-8601. И именно при использовании этого стандарта могут возникнуть проблемы.

Но главное: при использовании сравнения строк проблем в коде, описанном в данной теме, не возникнет.

Вы привели пример хорошего тона. И будет здорово, если автор темы изучит данный вопрос и будет использовать Ваш совет в будущем при работе с датами.
Я же отвечаю на вопрос в теме. И проблем при сравнении дат не возникнет. Код автора рабочий. Просто сам автор неверно его понимает. Оттого и вопросы возникают.

Я не вижу необходимости что-то обсуждать. Ибо мы только разводим оффтоп.

Источник

Поделиться с друзьями
Моя стройка
Adblock
detector