Допустимі формати дати/часу

У цьому розділі описуються всі різні формати в BNF-подібному синтаксисі, які приймає парсер: DateTimeImmutable DateTime date_create_immutable() date_create() date_parse() і strtotime(). Формати згруповані за розділами. У більшості випадків формати з різних розділів, розділені пробілом, комою або точкою, можуть використовуватися в одному і тому ж рядку дати/часу. Для кожного з підтримуваних форматів наведено один або кілька прикладів, а також опис формату. Символи в одинарних лапках нечутливі до регістру ('t' еквівалентно як t, так иT), символи в подвійних лапках чутливі до регістру ("T" означає тільки T

Щоб відформатувати об'єкти DateTimeImmutable і DateTime, обратитесь к документации методаDateTimeInterface::format()

Слід взяти до уваги загальне склепіння правил.

  1. Парсер допускає кожної одиниці виміру (рік, місяць, день, година, хвилина, секунда) повний діапазон значень. Для року це всього 4 цифри, для місяця – 0-12, дня – 0-31, для години – 0-24, а для хвилини – 0-59.

  2. Для секунд допускається значення 60, оскільки іноді рядки дати з цією секундою, що стрибає, дійсно з'являються. Але PHP реалізує час Unix, де "60" не є допустимим числом секунд і тому відбувається переповнення.

  3. Функцияstrtotime() повертає false, якщо якесь число знаходиться поза діапазонами, а конструкторDateTimeImmutable::__construct()викидає виняток.

  4. Якщо рядок містить дату, то всі елементи часу обнулюються до 0.

  5. Все менш значущі елементи часу скидаються до 0, якщо у цьому рядку є якась частина часу.

  6. Парсер не робить жодних перевірок, щоб зробити його швидше (і більш універсальним).

  7. Крім правил для окремих елементів часу, синтаксичний аналізатор розуміє і специфічніші комбіновані формати, наприклад, розбір міток часу Unix (@1690388256) та дат тижня у форматі ISO (2008-W28-3

  8. Існує додаткова перевірка, якщо вказано недійсну дату:

    Loading...

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

    array(1) {
      [11] =>
      string(27) "The parsed date was invalid"
    }
    
  9. Крайні випадки вже можна обробити, для цього необхідно використати методDateTimeImmutable::createFromFormat(), надаючи правильний формат.

    Loading...

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

    object(DateTimeImmutable)#1 (3) {
      ["date"]=>
      string(26) "2015-10-04 17:24:43.000000"
      ["timezone_type"]=>
      int(3)
      ["timezone"]=>
      string(13) "Europe/London"
    }
    

Формати часу

На цій сторінці описані формати дати/часу в BNF-подібному синтаксисі, які розуміє парсер функцій: DateTimeImmutable DateTime date_create() date_create_immutable() і strtotime()

Щоб відформатувати об'єкти DateTimeImmutable і DateTime, обратитесь к документации методаDateTimeInterface::format()

Використовувані символи

ОписФорматПриклады
frac (дробова частина). . [0-9]+".21342", ".85"
hh (годинник у 12-годинному форматі)"0"?[1-9]"1"[0-2]
HH (годинник у 24-годинному форматі)[01][0-9]"2"[0-4]
meridian (Ante meridiem або Post meridiem)[AaPp] .? [Mm] .? [\ \t ]"A.m.", "pM", "am."
MM (хвилини)[0-5][0-9]"00", "12", "59"
II (секунди)[0-5][0-9]"00", "12", "59"
space (Символ пробілу або табуляції)[ \t]
tz (часовий пояс)"("? [A-Za-z]{1,6} ")"?[A-Z][a-z]+([_ ][A-Z][a-z]+)+
tzcorrection (числове значення усунення часового поясу)"GMT"? [+-] hh ":"? MM?"+0400", "GMT-07:00", "-07:00"

12-годинний формат

ОписФорматПриклады
Тільки годинник (з Ante meridiem або Post meridiem)hhspace? meridian"4 am", "5PM"
Годинники та хвилини (з Ante meridiemилиPost meridiem) .hh [.:] MMspace? meridian"4:08 am", "7:19P.M."
Годинники, хвилини та секунди (з Ante meridiemилиPost meridiem) .hh [.:] MM [.:] IIspace? meridian"4:08:37 am", "7:19:19P.M."
MS SQL (Годинник, хвилини, секунди та дробова частина з Ante meridiem або Post meridiem)hh ":" MM ":" II [.:] [0-9]+ meridian"4:08:39:12313am"

24-годинний формат

ОписФорматПриклады
Годинник та хвилина't'? HH [.:] MM"04:08", "19.19", "T23:43"
Годинники та хвилини (без двокрапки-розділювача)'t'? HHMM"0408", "t1919", "T2343"
Годинники, хвилини та секунди't'? HH [.:] MM [.:] II"04.08.37", "t19:19:19"
Годинники, хвилини та секунди (без двокрапки-розділювача)'t'? HHMMII"040837", "T191919"
Годинник, хвилини, секунди та часовий пояс't'? HH [.:] MM [.:] IIspace? ( tzcorrectiontz
Годинники, хвилини, секунди та дрібна частина't'? HH [.:] MM [.:] IIfrac"04.08.37.81412", "19:19:19.532453"
Відомості про часовий поясtztzcorrection

Формати дати

На цій сторінці описані формати дати в BNF-подібному синтаксисі, які розуміє парсер функцій: DateTimeImmutable DateTime date_create() date_create_immutable() і strtotime()

Щоб відформатувати об'єкти DateTimeImmutable і DateTime, обратитесь к документации методаDateTimeInterface::format()

Використовувані символи

ОписФорматПриклады
daysuf (Суфікс порядкового числівника місяця)"st""nd"
dd (День місяця без провідних нулів)[0-2]? [0-9]"3"[01] daysuf?
DD (День місяця, 2 цифри з провідним нулем)"0" [0-9][1-2][0-9]
m (Повна або скорочена назва місяця)'january''february'
M (скорочена назва місяця)'jan''feb'
mm (порядковий номер місяця)"0"? [0-9]"1"[0-2]
MM (порядковий номер місяця, 2 цифри з провідним нулем)"0" [0-9]"1"[0-2]
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"
YYY[0-9]{5,19}"81412", "20192"

Регіональні нотації

ОписФорматПриклады
Місяць та день в американській нотації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"
День та назва місяцяdd [ \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"
Рік (розширений, 5-19 цифр зі знаком)[+-] YYY"-81120", "+20192"
Лише назва місяцяm"March", "jun", "DEC"

Нотації ISO8601

ОписФорматПриклады
8 цифр (рік, місяць та день)YYMMDD"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"
П'ятизначний рік з обов'язковим знаком, місяцем та днем[+-] YYY "-" MM "-" DD"-81120-02-26", "+20192-04-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 днів).

Зауважте, що діапазон днів обмежений 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" (мінус перший рік у календарі ISO 8601 та 2 рік до н. е. за григоріанським календарем).

Складові форматів

На цій сторінці описані різні складові формати дати/часу в BNF-подібному синтаксисі, які розуміє парсер функцій: DateTimeImmutable DateTime date_create() date_create_immutable() і strtotime()

Щоб відформатувати об'єкти DateTimeImmutable і DateTime, обратитесь к документации методаDateTimeInterface::format()

Використовувані символи

ОписФорматыПриклады
DD (День місяця з провідним нулем)"0" [0-9][1-2][0-9]
doy (День на рік)"00"[1-9]"0"[1-9][0-9]
frac (дробова частина). . [0-9]+".21342", ".85"
hh (годинник)"0"?[1-9]"1"[0-2]
HH (годинник з провідним нулем)[01][0-9]"2"[0-4]
meridian (Ante meridiem або Post meridiem)[AaPp] .? [Mm] .? [\ \t ]"A.m.", "pM", "am."
ii (хвилини)[0-5]? [0-9]"04", "8", "59"
II (хвилини з провідним нулем)[0-5][0-9]"04", "08", "59"
M (скорочене найменування місяця)'jan''feb'
MM (місяць із провідним нулем)[0-1][0-9]"00", "12"
space (Символ пробілу або табуляції)[ \t]
ss (секунди)[0-5]? [0-9]) .60
SS (секунди з провідним нулем)[0-5][0-9]"04", "08", "59"
W (тиждень у році)"0"[1-9][1-4][0-9]
tzcorrection (Зміщення часового поясу)"GMT"? [+-] hh ":"? II?"+0400", "GMT-07:00", "-07:00"
YY (4 цифри року)[0-9]{4}"2000", "2008", "1978"

Формати стандартів

ОписПриклады
ATOM"2022-06-02T16:58:35+00:00"
COOKIE"Thursday, 02-Jun-2022 16:58:35 UTC"
ISO8601"2022-06-02T16:58:35+0000"
» RFC 822"Thu, 02 Jun 22 16:58:35 +0000"
» RFC 850"Thursday, 02-Jun-22 16:58:35 UTC"
» RFC 1036"Thu, 02 Jun 22 16:58:35 +0000"
» RFC 1123"Thu, 02 Jun 2022 16:58:35 +0000"
» RFC 2822"Thu, 02 Jun 2022 16:58:35 +0000"
» RFC 3339"2022-06-02T16:58:35+00:00"
» RFC 3339 Extended"2022-06-02T16:58:35.698+00:00"
» RFC 7231"Thu, 02 Jun 2022 16:58:35 GMT"
RSS"Thu, 02 Jun 2022 16:58:35 +0000"
W3C"2022-06-02T16:58:35+00:00"

Регіональні нотації

ОписФорматПриклады
Загальний формат log-записівdd "/" M "/" YY : HH ":" II ":" SSspacetzcorrection"10/Oct/2000:13:55:36 -0700"
EXIFYY ":" MM ":" DD " " HH ":" II ":" SS"2008:08:07 18:11:31"
Рік та тиждень у форматі ISOYY "-"? "W" W"2008W27", "2008-W28"
Рік, тиждень у форматі ISO та день тижняYY "-"? "W" W "-"? [0-7]"2008W273", "2008-W28-3"
MySQLYY "-" MM "-" DD " " HH ":" II ":" SS"2008-08-07 18:11:31"
PostgreSQL: рік і день у роціYY "."? doy"2008.197", "2008197"
SOAPYY "-" MM "-" DD "T" HH ":" II ":" SSfractzcorrection?"2008-07-01T22:35:17.02", "2008-07-01T22:35:17.03+08:00"
Unix Timestamp"@" "-"? [0-9]+"@1215282385"
Мітка часу Unix з мікросекундами"@" "-"? [0-9]+ "." [0-9]{0,6}"@1607974647.503686"
XMLRPCYYMMDD "T" hh ":" II ":" SS"20080701T22:38:07", "20080701T9:38:07"
XMLRPC (Compact)YYMMDD 't' hhIISS"20080701t223807", "20080701T093807"
WDDXYY "-" mm "-" dd "T" hh ":" ii ":" ss"2008-7-1T9:3:37"

Зауваження :

Символ "W" у форматах "Рік та тиждень у форматі ISO" та "Рік, тиждень у форматі ISO та день тижня" чутливий до регістру, допускається використання символу "W" тільки у верхньому регістрі.

Символ "T" у форматах SOAP, XMLRPC та WDDX також чутливий до регістру, допускається використання символу "T" тільки у верхньому регістрі.

Формат Unix Timestamp встановлює часовий пояс в UTC.

Відносні формати

На цій сторінці описані відносні формати дати/часу в BNF-подібному синтаксисі, які розуміє парсер функцій: DateTimeImmutable DateTime date_create() date_create_immutable() і strtotime()

Щоб відформатувати об'єкти DateTimeImmutable і DateTime, обратитесь к документации методаDateTimeInterface::format()

Використовувані символи

ОписФормат
dayname (найменування дня тижня)'sunday'
daytext (інтервали в тижнях)'weekday'
number[+-]? [0-9]+
ordinal (порядкові числівники та покажчики)'first'
reltext (покажчики)'next'
space (Символи пробілу та табуляції)[ \t]+
unit (інтервали)'ms'

Нотації на днях

ФорматОписПриклады
'yesterday'Північ учора"yesterday 14:00"
'midnight'Час встановлюється о 00:00:00
'today'Час встановлюється о 00:00:00
'now'поточний час
'noon'Час встановлюється о 12:00:00"yesterday noon"
'tomorrow'Опівночі завтра
'back of' hour15 хвилин заданої години"back of 7pm", "back of 15"
'front of' hourБез 15 хвилин задану годину"front of 5am", "front of 23"
'first day of'Встановлює перший день цього місяця. Зазвичай цю нотацію краще використовувати разом із назвою місяця, що йде за нею, інакше буде враховуватися поточний місяць."first day of January 2008"
'last day of'Встановлює останній день цього місяця. Зазвичай цю нотацію краще використовувати разом із назвою місяця, що йде за нею, інакше буде враховуватися поточний місяць."last day of next month"
ordinalspacedaynamespace 'of'Обчислює x день тижня поточного чи заданого місяця."first sat of July 2008"
'last' spacedaynamespace 'of'Обчислює останній день тижня поточного чи заданого місяця."last sat of July 2008"
numberspace? (unit'week')Обчислює відносний час з використанням числових значень періоду.
ordinalreltextspaceunitОбчислює відносний час під час використання рядкових значень періоду. . lastиprevious те саме, що і -1this ні на що не впливає, а next+1
'ago'Віднімає всі значення від останнього отриманого моменту часу."2 days ago", "8 days ago 14:00", "2 months 5 days ago", "2 months ago 5 days", "2 days ago ago"
daynameПереміщається наступного дня вказаного дня тижня. (Дивіться зауваження) ."Monday"
reltextspace 'week'Розбирає специфічний формат "weekday + last/this/next week"."Monday next week"

Зауваження :

Відносні вирази завжди обробляються після які є відносними. Наприклад, "+1 week july 2008" еквівалентно "july 2008 +1 week".

Винятком цього правила є: "yesterday", "midnight", "today", "noon" і "tomorrow". Записи "tomorrow 11:00" та "11:00 tomorrow" відрізняються. Якщо прийняти сьогоднішню дату за "July 23rd, 2008", то перший запис повертає "2008-07-24 11:00", а другий "2008-07-24 00:00". Причина такої поведінки в тому, що ці п'ять виразів впливають безпосередньо на певний час.

Такі ключові слова як "first day of" залежать від контексту, в якому використовується рядок відносного формату. Якщо вона використовується у статичному методі або функції, то референтом є поточна системна позначка часу. Однак при використанні у методі DateTime::modify() або DateTimeImmutable::modify(), референтом є об'єкт, на якому викликається метод modify()

Зауваження :

Слід звернути увагу на наведені нижче зауваження щодо поточного дня тижня та дня тижня, вказаного у рядку дати/часу. Поточний день тижня може бути вирахований із незалежної частини рядка дати/часу.

  1. "dayname" не зсуває дату другого дня. (Наприклад: "Wed July 23rd, 2008" означає "2008-07-23").
  2. "number dayname" не зсуває дату другого дня. (Наприклад: "1 wednesday july 23rd, 2008" означає "2008-07-23").
  3. "numberweekdaynameдодає відповідну кількість тижнів, але не зсуває дату другого дня. У цьому випадку мають місце два різні блоки "number week" та "dayname". (Наприклад: "+1 week wednesday july 23rd, 2008" означає "2008-07-30").
  4. "ordinal dayname" зрушує дату другого дня. (Наприклад: "last wednesday july 23rd, 2008" означає "2008-07-30").
  5. "numberweekordinal daynameдодає відповідне число тижнів, а після зрушує дату другого дня. У цьому випадку мають місце два різні блоки "number week" та "ordinal dayname". (Наприклад: "+1 week first wednesday july 23rd, 2008" означає "2008-08-06").
  6. "ordinal dayname 'of' " не зсуває дату другого дня. (Наприклад: "first wednesday of july 23rd, 2008" означає "2008-07-02", тому що певні фрази з 'of' скидають день місяця на '1' і в цьому випадку ігнорується '23rd').

Також слід звернути увагу, що "of" в "ordinal space dayname space 'of'" та "'last' space dayname space 'of' " має особливе значення.

  1. Встановлює день місяця один.
  2. "ordinal dayname 'of' "не зсуває дату другого дня. (Наприклад: "first tuesday of july 2008" означає "2008-07-01").
  3. "ordinal dayname" зрушує дату другого дня. (Наприклад: "first tuesday july 2008" означає "2008-07-08", дивіться також 4-й пункт попереднього зауваження).
  4. "'last' dayname 'of' " отримує останній у місяці dayname. . (Наприклад: "last wed of july 2008" означає "2008-07-30")
  5. "'last' daynameотримує останній dayname перед поточним днем. (Наприклад: "last wed july 2008" означає "2008-06-25"; "july 2008" встановлює дату в "2008-07-01", а після "last wed" зміщує дату до попереднього середовища, а саме до "2008 -06-25 ").

Зауваження :

Відносні значення у місяцях розраховуються виходячи з їхньої тривалості. Наприклад, із "+2 month 2011-11-30" вийде "2012-01-30". Це з тим, що листопад складається з 30 днів, а грудень з 31 дня, що становить 61 днів.

Зауваження :

Під числом (number) Мається на увазі ціле число (integer); Якщо буде вказано десяткове число, то десяткова точка (або кома) розглядатиметься як роздільник. Наприклад, '+1.5 hours' буде вважатися як '+1 5 hours', а не'+1 hour +30 minutes'

список змін

ВерсияОпис
8.2.0Символи number більше не приймають кілька знаків, наприклад, +-2
7.0.8Тижні завжди починаються з понеділка. Раніше можна було визначити початок тижня з неділі.