PHP
Работа с датами и временем
Поиск…
Синтаксис
- string date (string $ format [, int $ timestamp = time ()])
- int strtotime (строка $ time [, int $ now])
Разбирайте описания дат в формате даты
Используя strtotime()
сочетании с date()
вы можете анализировать различные текстовые описания на английском языке по датам:
// Gets the current date
echo date("m/d/Y", strtotime("now")), "\n"; // prints the current date
echo date("m/d/Y", strtotime("10 September 2000")), "\n"; // prints September 10, 2000 in the m/d/Y format
echo date("m/d/Y", strtotime("-1 day")), "\n"; // prints yesterday's date
echo date("m/d/Y", strtotime("+1 week")), "\n"; // prints the result of the current date + a week
echo date("m/d/Y", strtotime("+1 week 2 days 4 hours 2 seconds")), "\n"; // same as the last example but with extra days, hours, and seconds added to it
echo date("m/d/Y", strtotime("next Thursday")), "\n"; // prints next Thursday's date
echo date("m/d/Y", strtotime("last Monday")), "\n"; // prints last Monday's date
echo date("m/d/Y", strtotime("First day of next month")), "\n"; // prints date of first day of next month
echo date("m/d/Y", strtotime("Last day of next month")), "\n"; // prints date of last day of next month
echo date("m/d/Y", strtotime("First day of last month")), "\n"; // prints date of first day of last month
echo date("m/d/Y", strtotime("Last day of last month")), "\n"; // prints date of last day of last month
Преобразование даты в другой формат
Основы
Простейший способ конвертировать один формат даты в другой - использовать strtotime()
с date()
. strtotime()
преобразует дату в strtotime()
Unix . Эта временная метка Unix затем может быть передана date()
для преобразования ее в новый формат.
$timestamp = strtotime('2008-07-01T22:35:17.02');
$new_date_format = date('Y-m-d H:i:s', $timestamp);
Или как однострочный:
$new_date_format = date('Y-m-d H:i:s', strtotime('2008-07-01T22:35:17.02'));
Имейте в виду, что strtotime()
требует, чтобы дата была в допустимом формате . Невозможность предоставить допустимый формат приведет к тому, что strtotime()
false, что приведет к тому, что ваша дата будет равна 1969-12-31.
Использование DateTime()
Начиная с PHP 5.2, PHP предложил класс DateTime()
который предлагает нам более мощные инструменты для работы с датами (и временем). Мы можем переписать вышеуказанный код с помощью DateTime()
следующим образом:
$date = new DateTime('2008-07-01T22:35:17.02');
$new_date_format = $date->format('Y-m-d H:i:s');
Работа с отметками времени Unix
date()
принимает временную метку Unix в качестве ее второго параметра и возвращает вам форматированную дату:
$new_date_format = date('Y-m-d H:i:s', '1234567890');
DateTime () работает с отметками времени Unix, добавляя @
перед меткой времени:
$date = new DateTime('@1234567890');
$new_date_format = $date->format('Y-m-d H:i:s');
Если временная метка у вас есть в миллисекундах (она может закончиться на 000
и / или отметка времени составляет тринадцать символов), вам нужно будет преобразовать ее в несколько секунд, прежде чем вы сможете преобразовать ее в другой формат. Есть два способа сделать это:
- Вырезать последние три цифры с помощью
substr()
Обрезка последних трех цифр может быть достигнута несколькими способами, но использование substr()
является самым простым:
$timestamp = substr('1234567899000', -3);
- Разделите субстрат на 1000
Вы также можете преобразовать метку времени в секундах, разделив ее на 1000. Поскольку временная метка слишком велика для 32-битных систем для математики, вам нужно будет использовать библиотеку BCMath для выполнения математики в виде строк:
$timestamp = bcdiv('1234567899000', '1000');
Чтобы получить strtotime()
времени Unix, вы можете использовать strtotime()
которая возвращает strtotime()
времени Unix:
$timestamp = strtotime('1973-04-18');
С помощью DateTime () вы можете использовать DateTime::getTimestamp()
$date = new DateTime('2008-07-01T22:35:17.02');
$timestamp = $date->getTimestamp();
Если вы используете PHP 5.2, вы можете использовать опцию форматирования U
:
$date = new DateTime('2008-07-01T22:35:17.02');
$timestamp = $date->format('U');
Работа с нестандартными и неоднозначными форматами дат
К сожалению, не все даты, с которыми разработчик должен работать, находятся в стандартном формате. К счастью, PHP 5.3 предоставил нам решение для этого. DateTime::createFromFormat()
позволяет нам рассказать PHP о том, в каком формате используется строка даты, чтобы ее можно было успешно проанализировать в объект DateTime для дальнейших манипуляций.
$date = DateTime::createFromFormat('F-d-Y h:i A', 'April-18-1973 9:48 AM');
$new_date_format = $date->format('Y-m-d H:i:s');
В PHP 5.4 мы получили возможность сделать доступ к члену класса при создании экземпляра, который позволяет нам превратить наш код DateTime()
в однострочный:
$new_date_format = (new DateTime('2008-07-01T22:35:17.02'))->format('Y-m-d H:i:s');
К сожалению, это не работает с DateTime::createFromFormat()
.
Использование предопределенных констант для формата даты
Мы можем использовать предопределенные константы для формата date()
в date()
вместо обычных строк формата даты с PHP 5.1.0.
Доступны предопределенные константы формата даты
DATE_ATOM
- Atom (2016-07-22T14: 50: 01 + 00: 00)
DATE_COOKIE
- HTTP Cookies (пятница, 22-Jul-16 14:50:01 UTC)
DATE_RSS
- RSS (пт, 22 июл 2016 14:50:01 +0000)
DATE_W3C
- Консорциум World Wide Web (2016-07-22T14: 50: 01 + 00: 00)
DATE_ISO8601
- ISO-8601 (2016-07-22T14: 50: 01 + 0000)
DATE_RFC822
- RFC 822 (пт, 22 июл 16 14:50:01 +0000)
DATE_RFC850
- RFC 850 (пятница, 22-июл-16 14:50:01 UTC)
DATE_RFC1036
- RFC 1036 (пт, 22 июл 16 14:50:01 +0000)
DATE_RFC1123
- RFC 1123 (пт, 22 июл 2016 14:50:01 +0000)
DATE_RFC2822
- RFC 2822 (пт, 22 июл 2016 14:50:01 +0000)
DATE_RFC3339
- То же, что DATE_ATOM (2016-07-22T14: 50: 01 + 00: 00)
Примеры использования
echo date(DATE_RFC822);
Это выведет: Пт, 22 июл 16 14:50:01 +0000
echo date(DATE_ATOM,mktime(0,0,0,8,15,1947));
Это будет выводить: 1947-08-15T00: 00: 00 + 05: 30
Получение разницы между двумя датами / временем
Наиболее целесообразным способом является использование класса DateTime
.
Пример:
<?php
// Create a date time object, which has the value of ~ two years ago
$twoYearsAgo = new DateTime("2014-01-18 20:05:56");
// Create a date time object, which has the value of ~ now
$now = new DateTime("2016-07-21 02:55:07");
// Calculate the diff
$diff = $now->diff($twoYearsAgo);
// $diff->y contains the difference in years between the two dates
$yearsDiff = $diff->y;
// $diff->m contains the difference in minutes between the two dates
$monthsDiff = $diff->m;
// $diff->d contains the difference in days between the two dates
$daysDiff = $diff->d;
// $diff->h contains the difference in hours between the two dates
$hoursDiff = $diff->h;
// $diff->i contains the difference in minutes between the two dates
$minsDiff = $diff->i;
// $diff->s contains the difference in seconds between the two dates
$secondsDiff = $diff->s;
// Total Days Diff, that is the number of days between the two dates
$totalDaysDiff = $diff->days;
// Dump the diff altogether just to get some details ;)
var_dump($diff);
Кроме того, сравнение двух дат намного проще, просто используйте операторы сравнения , например:
<?php
// Create a date time object, which has the value of ~ two years ago
$twoYearsAgo = new DateTime("2014-01-18 20:05:56");
// Create a date time object, which has the value of ~ now
$now = new DateTime("2016-07-21 02:55:07");
var_dump($now > $twoYearsAgo); // prints bool(true)
var_dump($twoYearsAgo > $now); // prints bool(false)
var_dump($twoYearsAgo <= $twoYearsAgo); // prints bool(true)
var_dump($now == $now); // prints bool(true)