Progress28.ru

IT Новости
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Php datetime compare

DateTime::diff

DateTimeInterface::diff

(PHP 5 >= 5.3.0, PHP 7)

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

Описание

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

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

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

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

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

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

Примеры

Пример #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 28 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]

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

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» ) );
>
?>

How to Compare Two Dates in PHP?

New here? Like SchoolsOfWeb on Facebook to stay up to date with new posts.

Problem:

You want to compare two dates and find out which one is more recent(greater).

Solution:

There are multiple ways to compare two dates. In the following, you’ll find 2 methods to compare two dates.

Method 1: Using strtotime() function

In this way, we’ll compare two dates by two steps-

  1. Convert two dates into their respective timestamps. The timestamp of a date, as you know, is number of seconds since January 1 1970 00:00:00 UTC.
  2. Then, find out the greater date comparing those two timestamps.

The following code show how to use strtotime() function to compare two dates-

Output:
2014-05-26 is greater than the 2014-05-17

How it works:

Line 4Using strtotime() function, we convert the first date to its equivalent timestamp.
Line 5Using strtotime() function, we convert the second date to its equivalent timestamp.
Line 6-7In line 6, we compare if the two dates are equal. If so, then, we print it in line 7
Line 8-11If two dates are not equal, then thses lines execute
Line 9The ternary operator checks if $timestamp1(which is the first date) is greater than $timestamp2. If so(which is actually does), it prints the string before the colon(:), if not, it prints the next string after colon.
Читать еще:  Правовые основы защиты гос тайны

Method 2: Using diff() method of DateTime class from SPL

One of the classes that SPL(Standard PHP Library) supplies is DateTime class and it has a method named diff() which can returns difference between two date objects. We’ll apply the following steps to compare the two dates using this method-

  1. Convert each date to its Date equivalent DateTime object using DateTime class.
  2. Calculate the day interval between two dates as object using diff() method.
  3. Convert the Day interval object to its equivalent day number using format() method which will reveal which date is greater than the other.

See the following example to see how the method works-

Output:
2014-05-26 is greater than the 2014-05-17

How it works:

Line 4-5Using the two dates($date1 and $date2), we create two DateTime objects ($datetimeObj1, $datetimeObj2) from the DateTime class.
Line 6The diff() method will substract from $datetimeObj2 to $datetimeObj1 and return it as an object($interval).
Line 7Here, we use format() method to convert the $interval object to human readable format. %R displays the sign of the difference between two dates and %a displays the total number of days. If you prints the variable $dateDiff, it will display -9.
Line 9-10If two dates are same, the text in line 10 will display.
Line 11-13If two dates are not equal these lines will be executed.
Line 12As $dateDiff is -9, so the string after colon(:) will be displayed as output.

Thank you Method 2 using diff function really helps to match the dates.

How to Compare Two Dates in PHP?

New here? Like SchoolsOfWeb on Facebook to stay up to date with new posts.

Problem:

You want to compare two dates and find out which one is more recent(greater).

Solution:

There are multiple ways to compare two dates. In the following, you’ll find 2 methods to compare two dates.

Method 1: Using strtotime() function

In this way, we’ll compare two dates by two steps-

  1. Convert two dates into their respective timestamps. The timestamp of a date, as you know, is number of seconds since January 1 1970 00:00:00 UTC.
  2. Then, find out the greater date comparing those two timestamps.

The following code show how to use strtotime() function to compare two dates-

Output:
2014-05-26 is greater than the 2014-05-17

How it works:

Line 4Using strtotime() function, we convert the first date to its equivalent timestamp.
Line 5Using strtotime() function, we convert the second date to its equivalent timestamp.
Line 6-7In line 6, we compare if the two dates are equal. If so, then, we print it in line 7
Line 8-11If two dates are not equal, then thses lines execute
Line 9The ternary operator checks if $timestamp1(which is the first date) is greater than $timestamp2. If so(which is actually does), it prints the string before the colon(:), if not, it prints the next string after colon.

Method 2: Using diff() method of DateTime class from SPL

One of the classes that SPL(Standard PHP Library) supplies is DateTime class and it has a method named diff() which can returns difference between two date objects. We’ll apply the following steps to compare the two dates using this method-

  1. Convert each date to its Date equivalent DateTime object using DateTime class.
  2. Calculate the day interval between two dates as object using diff() method.
  3. Convert the Day interval object to its equivalent day number using format() method which will reveal which date is greater than the other.
Читать еще:  Php recordid спирка fund

See the following example to see how the method works-

Output:
2014-05-26 is greater than the 2014-05-17

How it works:

Line 4-5Using the two dates($date1 and $date2), we create two DateTime objects ($datetimeObj1, $datetimeObj2) from the DateTime class.
Line 6The diff() method will substract from $datetimeObj2 to $datetimeObj1 and return it as an object($interval).
Line 7Here, we use format() method to convert the $interval object to human readable format. %R displays the sign of the difference between two dates and %a displays the total number of days. If you prints the variable $dateDiff, it will display -9.
Line 9-10If two dates are same, the text in line 10 will display.
Line 11-13If two dates are not equal these lines will be executed.
Line 12As $dateDiff is -9, so the string after colon(:) will be displayed as output.

Thank you Method 2 using diff function really helps to match the dates.

Сравнение даты и времени при помощи 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 приводятся дополнительные примеры.

Данная публикация представляет собой перевод статьи « Compare Date and Time With PHP strtotime() | Quick Reference Tutorial » , подготовленной дружной командой проекта Интернет-технологии.ру

Ссылка на основную публикацию
Adblock
detector