Форматы даты

На этой странице описаны форматы даты, которые понимает парсер функций strtotime(), DateTime и date_create().

Используемые символы
Описание Формат Примеры
daysuf (суффикс порядкового числительного дня месяца) "st" | "nd" | "rd" | "th"  
dd (день месяца без ведущих нулей) ([0-2]?[0-9] | "3"[01]) daysuf? "7th", "22nd", "31"
DD (день месяца, 2 цифры с ведущим нулем) "0" [0-9] | [1-2][0-9] | "3" [01] "07", "31"
m (полное или сокращенное название месяца) 'january' | 'february' | 'march' | 'april' | 'may' | 'june' | 'july' | 'august' | 'september' | 'october' | 'november' | 'december' | 'jan' | 'feb' | 'mar' | 'apr' | 'may' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec' | "I" | "II" | "III" | "IV" | "V" | "VI" | "VII" | "VIII" | "IX" | "X" | "XI" | "XII"  
M (сокращенное название месяца) 'jan' | 'feb' | 'mar' | 'apr' | 'may' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec'  
mm (порядковый номер месяца) "0"? [0-9] | "1"[0-2] "0", "04", "7", "12"
MM (порядковый номер месяца, 2 цифры с ведущим нулем) "0" [0-9] | "1"[0-2] "00", "04", "07", "12"
y (порядковый номер года) [0-9]{1,4} "00", "78", "08", "8", "2008"
yy (порядковый номер года, 2 цифры) [0-9]{2} "00", "08", "78"
YY (порядковый номер года, 4 цифры) [0-9]{4} "2000", "2008", "1978"
Региональные нотации
Описание Формат Примеры
Месяц и день в американской нотации mm "/" dd "5/12", "10/27"
Месяц, день и год в американской нотации mm "/" dd "/" y "12/22/78", "1/17/2006", "1/17/6"
4 цифры года, месяц и день со слешем-разделителем YY "/" mm "/" dd "2008/6/30", "1978/12/22"
4 цифры года и месяц (GNU) YY "-" mm "2008-6", "2008-06", "1978-12"
Год, месяц и день с дефисом-разделителем y "-" mm "-" dd "2008-6-30", "78-12-22", "8-6-21"
День, месяц и 4 цифры года с разделителем в виде точки, символа табуляции или дефиса dd [.\t-] mm [.-] YY "30-6-2008", "22.12.1978"
День, месяц и 2 цифры года с разделителем в виде точки или символа табуляции dd [.\t] mm "." yy "30.6.08", "22.12.78"
День, название месяца и год dd ([ \t.-])* m ([ \t.-])* y "30-June 2008", "22DEC78", "14 III 1879"
Название месяца и 4 цифры года (день месяца сбрасывается на 1) m ([ \t.-])* YY "June 2008", "DEC1978", "March 1879"
4 цифры года и название месяца (день месяца сбрасывается на 1) YY ([ \t.-])* m "2008 June", "1978-XII", "1879.MArCH"
Название месяца, день и год m ([ .\t-])* dd [,.stndrh\t ]+ y "July 1st, 2008", "April 17, 1790", "May.9,78"
Название месяца и день m ([ .\t-])* dd [,.stndrh\t ]* "July 1st,", "Apr 17", "May.9"
День и название месяца d ([ .\t-])* m "1 July", "17 Apr", "9.May"
Сокращенное название месяца, день и год M "-" DD "-" y "May-09-78", "Apr-17-1790"
Год, сокращенное название месяца и день y "-" M "-" DD "78-Dec-22", "1814-MAY-17"
Только год YY "1978", "2008"
Только название месяца m "March", "jun", "DEC"
Нотации ISO8601
Описание Формат Примеры
8 цифр (год, месяц и день) YY MM DD "15810726", "19780417", "18140517"
8 цифр (год, месяц и день) со слешем-разделителем YY "/" MM "/" DD "2008/06/30", "1978/12/22"
2 цифры года, месяц и день с дефисом-разделителем yy "-" MM "-" DD "08-06-30", "78-12-22"
4 цифры года с необязательным знаком, месяц и день [+-]? YY "-" MM "-" DD "-0002-07-26", "+1978-04-17", "1814-05-17"

Замечание:

Форматы y и yy для годов меньше 100 обрабатываются в исключительных случаях при использовании символов y или yy. Если год попадает в диапазон 0-69 (включительно), то к нему добавляется 2000. Если же год принадлежит диапазону 70-99 (включительно), то к нему добавляется 1900. Это означает, что дата "00-01-01" интерпретируется как "2000-01-01".

Замечание:

Формат "День, месяц и 2 цифры года с разделителем в виде точки или символа табуляции" (dd [.\t] mm "." yy) работает только для годов из диапазона 61-99 (включительно). За пределами этого диапазона отдается предпочтение формату времени "HH [.:] MM [.:] SS".

Замечание:

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

Замечание:

Возможен выход за границы диапазона форматов dd и DD. День месяца с порядковым номером 0 подразумевает последний день предыдущего месяца в результате выхода за границы диапазона. Согласно написанному "2008-08-00" равносильно "2008-07-31", а "2008-06-31" соответствует "2008-07-01" (в июне всего 30 дней).

Обратите внимание, что с PHP 5.1.0 диапазон дней ограничен 0-31, как указано выше регулярным выражением. Так что, например, "2008-06-32" - некорректная дата.

Также допускается выход за границы диапазона для форматов mm и MM со значением 0. Значение месяца 0 соответствует декабрю предыдущего года. Например дата "2008-00-22" равносильна "2007-12-22".

Если учесть два предыдущих замечания и выход за границы диапазона дней и месяцев, получим следующее: дата "2008-00-00" в первую очередь преобразуется в "2007-12-00", которая будет преобразована в "2007-11-30". То же случится с датой "0000-00-00", которая будет преобразована к "-0001-11-30" (-1-й год в календаре ISO 8601 и 2 год до н.э. по григорианскому календарю).

add a note add a note

User Contributed Notes 4 notes

up
7
Mirek
3 years ago
Note: the day (dd or DD) is first checked for range 0..31 and only if it fits, the overflow and underflow mechanism may apply. If not, strtotime() simply returns false.
If you need unlimited over/underflow for date calculations (for example 2015-01-40 to 2015-02-09), use mktime() instead.
up
-24
matt at azoundria dot com
2 years ago
It's important to note that strtotime does NOT successfully handle any date/time format with the word 'at' in it. (Commonly used.) ie:

September 15th at 6:12 PM

It also does not handle any date/time format with brackets (also reasonably common).

September 15th (6:12:14 PM)

To get around this, and create a more universally compatible strtotime, create your own custom strtotime which first filters these out with a str_replace.

function fullstrtotime ($time) {
  return strtotime(str_replace(array(" at", "(", ")"), "", $time));
}
up
-7
joel dot r dot geurts at gmail dot com
9 months ago
When a javascript date object is saved to a database directly, a string with the following format is saved:

Thu Jan 01 1970 07:00:00 GMT-0500 (Eastern Standard Time)

I read through this article and didn't see any matches for an allowed pattern, so I thought it couldn't work. Then I was encouraged by a coworker to just try dropping the time zone in parenthesis '(Eastern Standard Time)' and lo and behold it worked.

TLDR: dropping the second time zone from a string from a javascript date object saved into a DB, will allow it to be properly parsed.
up
-63
Anonymous
2 years ago
Note: the day (dd or DD) is first checked for range 0..31 and only if it fits, the overflow and underflow mechanism may apply. If not, strtotime() simply returns false.
If you need unlimited over/underflow for date calculations (for example 2015-01-40 to 2015-02-09), use mktime() instead.
To Top