Допустимі формати дати/часу
У цьому розділі описуються всі різні формати в BNF-подібному синтаксисі, які приймає парсер: DateTimeImmutable DateTime date_create_immutable() date_create() date_parse() і strtotime(). Формати згруповані за розділами. У більшості випадків формати з різних розділів, розділені пробілом, комою або точкою, можуть використовуватися в одному і тому ж рядку дати/часу. Для кожного з підтримуваних форматів наведено один або кілька прикладів, а також опис формату. Символи в одинарних лапках нечутливі до регістру ('t'
еквівалентно як t
, так иT
), символи в подвійних лапках чутливі до регістру ("T"
означає тільки T
Щоб відформатувати об'єкти DateTimeImmutable і DateTime, обратитесь к документации методаDateTimeInterface::format()
Слід взяти до уваги загальне склепіння правил.
-
Парсер допускає кожної одиниці виміру (рік, місяць, день, година, хвилина, секунда) повний діапазон значень. Для року це всього 4 цифри, для місяця – 0-12, дня – 0-31, для години – 0-24, а для хвилини – 0-59.
-
Для секунд допускається значення 60, оскільки іноді рядки дати з цією секундою, що стрибає, дійсно з'являються. Але PHP реалізує час Unix, де "60" не є допустимим числом секунд і тому відбувається переповнення.
-
Функцияstrtotime() повертає
false
, якщо якесь число знаходиться поза діапазонами, а конструкторDateTimeImmutable::__construct()викидає виняток. -
Якщо рядок містить дату, то всі елементи часу обнулюються до 0.
-
Все менш значущі елементи часу скидаються до 0, якщо у цьому рядку є якась частина часу.
-
Парсер не робить жодних перевірок, щоб зробити його швидше (і більш універсальним).
-
Крім правил для окремих елементів часу, синтаксичний аналізатор розуміє і специфічніші комбіновані формати, наприклад, розбір міток часу Unix (
@1690388256
) та дат тижня у форматі ISO (2008-W28-3
-
Існує додаткова перевірка, якщо вказано недійсну дату:
Loading...Результат виконання наведеного прикладу:
array(1) { [11] => string(27) "The parsed date was invalid" }
-
Крайні випадки вже можна обробити, для цього необхідно використати метод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) | hh space ? meridian | "4 am", "5PM" |
Годинники та хвилини (з Ante meridiem илиPost meridiem ) . | hh [.:] MM space ? meridian | "4:08 am", "7:19P.M." |
Годинники, хвилини та секунди (з Ante meridiem илиPost meridiem ) . | hh [.:] MM [.:] II space ? 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'? HH MM | "0408", "t1919", "T2343" |
Годинники, хвилини та секунди | 't'? HH [.:] MM [.:] II | "04.08.37", "t19:19:19" |
Годинники, хвилини та секунди (без двокрапки-розділювача) | 't'? HH MM II | "040837", "T191919" |
Годинник, хвилини, секунди та часовий пояс | 't'? HH [.:] MM [.:] II space ? ( tzcorrection | tz |
Годинники, хвилини, секунди та дрібна частина | 't'? HH [.:] MM [.:] II frac | "04.08.37.81412", "19:19:19.532453" |
Відомості про часовий пояс | tz | tzcorrection |
Формати дати
На цій сторінці описані формати дати в 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 цифр (рік, місяць та день) | 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" |
П'ятизначний рік з обов'язковим знаком, місяцем та днем | [+-] 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 ":" SS space tzcorrection | "10/Oct/2000:13:55:36 -0700" |
EXIF | YY ":" MM ":" DD " " HH ":" II ":" SS | "2008:08:07 18:11:31" |
Рік та тиждень у форматі ISO | YY "-"? "W" W | "2008W27", "2008-W28" |
Рік, тиждень у форматі ISO та день тижня | YY "-"? "W" W "-"? [0-7] | "2008W273", "2008-W28-3" |
MySQL | YY "-" MM "-" DD " " HH ":" II ":" SS | "2008-08-07 18:11:31" |
PostgreSQL: рік і день у році | YY "."? doy | "2008.197", "2008197" |
SOAP | YY "-" MM "-" DD "T" HH ":" II ":" SS frac tzcorrection ? | "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" |
XMLRPC | YY MM DD "T" hh ":" II ":" SS | "20080701T22:38:07", "20080701T9:38:07" |
XMLRPC (Compact) | YY MM DD 't' hh II SS | "20080701t223807", "20080701T093807" |
WDDX | YY "-" 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' hour | 15 хвилин заданої години | "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" |
ordinal space dayname space 'of' | Обчислює x день тижня поточного чи заданого місяця. | "first sat of July 2008" |
'last' space dayname space 'of' | Обчислює останній день тижня поточного чи заданого місяця. | "last sat of July 2008" |
number space ? (unit | 'week') | Обчислює відносний час з використанням числових значень періоду. |
ordinal | reltext space unit | Обчислює відносний час під час використання рядкових значень періоду. . last иprevious те саме, що і -1 this ні на що не впливає, а 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" |
reltext space '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()
Зауваження :
Слід звернути увагу на наведені нижче зауваження щодо поточного дня тижня та дня тижня, вказаного у рядку дати/часу. Поточний день тижня може бути вирахований із незалежної частини рядка дати/часу.
- "
dayname
" не зсуває дату другого дня. (Наприклад: "Wed July 23rd, 2008" означає "2008-07-23").- "
number
dayname
" не зсуває дату другого дня. (Наприклад: "1 wednesday july 23rd, 2008" означає "2008-07-23").- "
number
weekdayname
додає відповідну кількість тижнів, але не зсуває дату другого дня. У цьому випадку мають місце два різні блоки "number
week" та "dayname
". (Наприклад: "+1 week wednesday july 23rd, 2008" означає "2008-07-30").- "
ordinal
dayname
" зрушує дату другого дня. (Наприклад: "last wednesday july 23rd, 2008" означає "2008-07-30").- "
number
weekordinal
dayname
додає відповідне число тижнів, а після зрушує дату другого дня. У цьому випадку мають місце два різні блоки "number
week" та "ordinal
dayname
". (Наприклад: "+1 week first wednesday july 23rd, 2008" означає "2008-08-06").- "
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' " має особливе значення.
- Встановлює день місяця один.
- "
ordinal
dayname
'of' "не зсуває дату другого дня. (Наприклад: "first tuesday of july 2008" означає "2008-07-01").- "
ordinal
dayname
" зрушує дату другого дня. (Наприклад: "first tuesday july 2008" означає "2008-07-08", дивіться також 4-й пункт попереднього зауваження).- "'last'
dayname
'of' " отримує останній у місяціdayname
. . (Наприклад: "last wed of july 2008" означає "2008-07-30")- "'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 | Тижні завжди починаються з понеділка. Раніше можна було визначити початок тижня з неділі. |