1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-25 16:22:18 +01:00
Files
archived-doc-ru/reference/datetime/formats.xml
2024-04-23 05:23:34 +03:00

1213 lines
52 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: ac83abe55f4da019036de5ec14400d674fa3f9f5 Maintainer: aur Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="datetime.formats" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Допустимые форматы даты и времени</title>
<para>
Раздел описывает разные форматы в BNF-подобном синтаксисе, которые принимает парсер:
<classname>DateTimeImmutable</classname>, <classname>DateTime</classname>,
<function>date_create_immutable</function>,
<function>date_create</function>, <function>date_parse</function> и
<function>strtotime</function>. Форматы сгруппированы
по разделам. В большинстве случаев форматы из разных разделов, разделённые
пробелом, запятой или точкой, могут использоваться в одной и той же строке даты и времени. Для каждого
из поддерживаемых форматов приведены один или несколько примеров, а также
описание формата. Символы в одинарных кавычках нечувствительны к регистру
(<literal>'t'</literal> эквивалентно как <literal>t</literal>, так и <literal>T</literal>),
символы в двойных кавычках чувствительны к регистру
(<literal>"T"</literal> означает только <literal>T</literal>).
</para>
<para>
Чтобы отформатировать объекты <classname>DateTimeImmutable</classname> и <classname>DateTime</classname>,
обратитесь к документации метода <function>DateTimeInterface::format</function>.
</para>
<para>
Следует принять во внимание общий свод правил.
</para>
<orderedlist>
<listitem>
<simpara>
Парсер допускает для каждой единицы измерения (год, месяц, день, час, минута, секунда) полный диапазон значений.
Для года это всего 4 цифры, для месяца — 0-12, дня — 0-31, для часа — 0-24, а для минуты — 0-59.
</simpara>
</listitem>
<listitem>
<simpara>
Для секунд допускается значение 60, так как иногда строки даты с этой прыгающей секундой действительно появляются.
Но PHP реализует время Unix, где "60" не является допустимым числом секунд и поэтому происходит переполнение.
</simpara>
</listitem>
<listitem>
<simpara>
Функция <function>strtotime</function> возвращает &false;, если какое-либо число находится вне диапазонов,
а конструктор <function>DateTimeImmutable::__construct</function> выбрасывает исключение.
</simpara>
</listitem>
<listitem>
<simpara>
Если строка содержит дату, все элементы времени обнуляются до 0.
</simpara>
</listitem>
<listitem>
<simpara>
Все менее значимые элементы времени сбрасываются до 0,
если в данной строке присутствует какая-либо часть времени.
</simpara>
</listitem>
<listitem>
<simpara>
Парсер не делает никаких проверок, чтобы сделать его быстрее (и более универсальным).
</simpara>
</listitem>
<listitem>
<simpara>
Помимо правил для отдельных элементов времени, синтаксический анализатор
понимает и более специфические <link linkend="datetime.formats.compound">комбинированные форматы</link>,
например, разбор меток времени Unix (<literal>@1690388256</literal>)
и дат недели в формате ISO (<literal>2008-W28-3</literal>).
</simpara>
</listitem>
<listitem>
<para>
Существует дополнительная проверка, если указана недействительная дата:
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$res = date_parse("2015-09-31");
var_dump($res["warnings"]);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
array(1) {
[11] =>
string(27) "The parsed date was invalid"
}
]]>
</screen>
</informalexample>
</para>
</listitem>
<listitem>
<para>
Крайние случаи уже можно обработать, для этого необходимо вызывать
метод <function>DateTimeImmutable::createFromFormat</function>,
предоставляя правильный формат.
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$res = DateTimeImmutable::createFromFormat("Y-m-d", "2015-09-34");
var_dump($res);
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
object(DateTimeImmutable)#1 (3) {
["date"]=>
string(26) "2015-10-04 17:24:43.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(13) "Europe/London"
}
]]>
</screen>
</informalexample>
</para>
</listitem>
</orderedlist>
<!--Time Formats: {{{-->
<sect1 annotations="chunk:false" xml:id="datetime.formats.time">
<title>Форматы времени</title>
<para>
Эта страница описывает форматы даты и времени в BNF-подобном синтаксисе, которые понимает парсер функций:
<classname>DateTimeImmutable</classname>, <classname>DateTime</classname>,
<function>date_create</function>,
<function>date_create_immutable</function> и
<function>strtotime</function>.
</para>
<para>
Чтобы отформатировать объекты <classname>DateTimeImmutable</classname> и <classname>DateTime</classname>,
обратитесь к документации метода <function>DateTimeInterface::format</function>.
</para>
<table>
<title>Используемые символы</title>
<tgroup cols="3">
<thead>
<row>
<entry>Описание</entry>
<entry>Формат</entry>
<entry>Примеры</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>frac</literal> (дробная часть)</entry>
<entry>. [0-9]+</entry>
<entry>".21342", ".85"</entry>
</row>
<row>
<entry><literal>hh</literal> (часы в 12-часовом формате)</entry>
<entry>"0"?[1-9] | "1"[0-2]</entry>
<entry>"04", "7", "12"</entry>
</row>
<row>
<entry><literal>HH</literal> (часы в 24-часовом формате)</entry>
<entry>[01][0-9] | "2"[0-4]</entry>
<entry>"04", "07", "19"</entry>
</row>
<row>
<entry><literal>meridian</literal> (Ante meridiem или Post meridiem)</entry>
<entry>[AaPp] .? [Mm] .? [\0\t ]</entry>
<entry>"A.m.", "pM", "am."</entry>
</row>
<row>
<entry><literal>MM</literal> (минуты)</entry>
<entry>[0-5][0-9]</entry>
<entry>"00", "12", "59"</entry>
</row>
<row>
<entry><literal>II</literal> (секунды)</entry>
<entry>[0-5][0-9]</entry>
<entry>"00", "12", "59"</entry>
</row>
<row>
<entry><literal>space</literal> (символ пробела или табуляции)</entry>
<entry>[ \t]</entry>
<entry></entry>
</row>
<row>
<entry><literal>tz</literal> (часовой пояс)</entry>
<entry>"("? [A-Za-z]{1,6} ")"? | [A-Z][a-z]+([_/][A-Z][a-z]+)+</entry>
<entry>"CEST", "Europe/Amsterdam", "America/Indiana/Knox"</entry>
</row>
<row>
<entry><literal>tzcorrection</literal> (числовое значение смещения часового пояса)</entry>
<entry>"GMT"? [+-] <literal>hh</literal> ":"? <literal>MM</literal>?</entry>
<entry>"+0400", "GMT-07:00", "-07:00"</entry>
</row>
</tbody>
</tgroup>
</table>
<table>
<title>12-часовой формат</title>
<tgroup cols="3">
<thead>
<row>
<entry>Описание</entry>
<entry>Формат</entry>
<entry>Примеры</entry>
</row>
</thead>
<tbody>
<row>
<entry>Только часы (с Ante meridiem или Post meridiem)</entry>
<entry><literal>hh</literal> <literal>space</literal>? <literal>meridian</literal></entry>
<entry>"4 am", "5PM"</entry>
</row>
<row>
<entry>Часы и минуты (с <literal>Ante meridiem</literal> или <literal>Post meridiem</literal>)</entry>
<entry><literal>hh</literal> [.:] <literal>MM</literal> <literal>space</literal>? <literal>meridian</literal></entry>
<entry>"4:08 am", "7:19P.M."</entry>
</row>
<row>
<entry>Часы, минуты и секунды (с <literal>Ante meridiem</literal> или <literal>Post meridiem</literal>)</entry>
<entry><literal>hh</literal> [.:] <literal>MM</literal> [.:] <literal>II</literal> <literal>space</literal>? <literal>meridian</literal></entry>
<entry>"4:08:37 am", "7:19:19P.M."</entry>
</row>
<row>
<entry>MS SQL (Часы, минуты, секунды и дробная часть с Ante meridiem или Post meridiem)</entry>
<entry><literal>hh</literal> ":" <literal>MM</literal> ":" <literal>II</literal> [.:] [0-9]+ <literal>meridian</literal></entry>
<entry>"4:08:39:12313am"</entry>
</row>
</tbody>
</tgroup>
</table>
<table>
<title>24-часовой формат</title>
<tgroup cols="3">
<thead>
<row>
<entry>Описание</entry>
<entry>Формат</entry>
<entry>Примеры</entry>
</row>
</thead>
<tbody>
<row>
<entry>Часы и минуты</entry>
<entry>'t'? <literal>HH</literal> [.:] <literal>MM</literal></entry>
<entry>"04:08", "19.19", "T23:43"</entry>
</row>
<row>
<entry>Часы и минуты (без двоеточия-разделителя)</entry>
<entry>'t'? <literal>HH</literal> <literal>MM</literal></entry>
<entry>"0408", "t1919", "T2343"</entry>
</row>
<row>
<entry>Часы, минуты и секунды</entry>
<entry>'t'? <literal>HH</literal> [.:] <literal>MM</literal> [.:] <literal>II</literal></entry>
<entry>"04.08.37", "t19:19:19"</entry>
</row>
<row>
<entry>Часы, минуты и секунды (без двоеточия-разделителя)</entry>
<entry>'t'? <literal>HH</literal> <literal>MM</literal> <literal>II</literal></entry>
<entry>"040837", "T191919"</entry>
</row>
<row>
<entry>Часы, минуты, секунды и часовой пояс</entry>
<entry>'t'? <literal>HH</literal> [.:] <literal>MM</literal> [.:] <literal>II</literal> <literal>space</literal>? ( <literal>tzcorrection</literal> | <literal>tz</literal> )</entry>
<entry>"040837CEST", "T191919-0700"</entry>
</row>
<row>
<entry>Часы, минуты, секунды и дробная часть</entry>
<entry>'t'? <literal>HH</literal> [.:] <literal>MM</literal> [.:] <literal>II</literal> <literal>frac</literal></entry>
<entry>"04.08.37.81412", "19:19:19.532453"</entry>
</row>
<row>
<entry>Сведения о часовом поясе</entry>
<entry><literal>tz</literal> | <literal>tzcorrection</literal></entry>
<entry>"CEST", "Europe/Amsterdam", "+0430", "GMT-06:00"</entry>
</row>
</tbody>
</tgroup>
</table>
</sect1>
<!--}}}-->
<!--Date Formats: {{{-->
<sect1 annotations="chunk:false" xml:id="datetime.formats.date">
<title>Форматы даты</title>
<para>
Эта страница описывает форматы даты в BNF-подобном синтаксисе, которые понимает парсер функций:
<classname>DateTimeImmutable</classname>, <classname>DateTime</classname>,
<function>date_create</function>,
<function>date_create_immutable</function> и
<function>strtotime</function>.
</para>
<para>
Чтобы отформатировать объекты <classname>DateTimeImmutable</classname> и <classname>DateTime</classname>,
обратитесь к документации метода <function>DateTimeInterface::format</function>.
</para>
<table>
<title>Используемые символы</title>
<tgroup cols="3">
<thead>
<row>
<entry>Описание</entry>
<entry>Формат</entry>
<entry>Примеры</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>daysuf</literal> (суффикс порядкового числительного дня месяца)</entry>
<entry>"st" | "nd" | "rd" | "th"</entry>
<entry></entry>
</row>
<row>
<entry><literal>dd</literal> (день месяца без ведущих нулей)</entry>
<entry>([0-2]?[0-9] | "3"[01]) <literal>daysuf</literal>?</entry>
<entry>"7th", "22nd", "31"</entry>
</row>
<row>
<entry><literal>DD</literal> (день месяца, 2 цифры с ведущим нулём)</entry>
<entry>"0" [0-9] | [1-2][0-9] | "3" [01]</entry>
<entry>"07", "31"</entry>
</row>
<row>
<entry><literal>m</literal> (полное или сокращённое название месяца)</entry>
<entry>'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"</entry>
<entry></entry>
</row>
<row>
<entry><literal>M</literal> (сокращённое название месяца)</entry>
<entry>'jan' | 'feb' | 'mar' | 'apr' | 'may' | 'jun' | 'jul' | 'aug' |
'sep' | 'sept' | 'oct' | 'nov' | 'dec'</entry>
<entry></entry>
</row>
<row>
<entry><literal>mm</literal> (порядковый номер месяца)</entry>
<entry>"0"? [0-9] | "1"[0-2]</entry>
<entry>"0", "04", "7", "12"</entry>
</row>
<row>
<entry><literal>MM</literal> (порядковый номер месяца, 2 цифры с ведущим нулём)</entry>
<entry>"0" [0-9] | "1"[0-2]</entry>
<entry>"00", "04", "07", "12"</entry>
</row>
<row>
<entry><literal>y</literal> (порядковый номер года)</entry>
<entry>[0-9]{1,4}</entry>
<entry>"00", "78", "08", "8", "2008"</entry>
</row>
<row>
<entry><literal>yy</literal> (порядковый номер года, 2 цифры)</entry>
<entry>[0-9]{2}</entry>
<entry>"00", "08", "78"</entry>
</row>
<row>
<entry><literal>YY</literal> (порядковый номер года, 4 цифры)</entry>
<entry>[0-9]{4}</entry>
<entry>"2000", "2008", "1978"</entry>
</row>
<row>
<entry><literal>YYY</literal></entry>
<entry>[0-9]{5,19}</entry>
<entry>"81412", "20192"</entry>
</row>
</tbody>
</tgroup>
</table>
<table>
<title>Региональные нотации</title>
<tgroup cols="3">
<thead>
<row>
<entry>Описание</entry>
<entry>Формат</entry>
<entry>Примеры</entry>
</row>
</thead>
<tbody>
<row>
<entry>Месяц и день в американской нотации</entry>
<entry><literal>mm</literal> "/" <literal>dd</literal></entry>
<entry>"5/12", "10/27"</entry>
</row>
<row>
<entry>Месяц, день и год в американской нотации</entry>
<entry><literal>mm</literal> "/" <literal>dd</literal> "/" <literal>y</literal></entry>
<entry>"12/22/78", "1/17/2006", "1/17/6"</entry>
</row>
<row>
<entry>4 цифры года, месяц и день со слешем-разделителем</entry>
<entry><literal>YY</literal> "/" <literal>mm</literal> "/" <literal>dd</literal></entry>
<entry>"2008/6/30", "1978/12/22"</entry>
</row>
<row>
<entry>4 цифры года и месяц (GNU)</entry>
<entry><literal>YY</literal> "-" <literal>mm</literal></entry>
<entry>"2008-6", "2008-06", "1978-12"</entry>
</row>
<row>
<entry>Год, месяц и день с дефисом-разделителем</entry>
<entry><literal>y</literal> "-" <literal>mm</literal> "-" <literal>dd</literal></entry>
<entry>"2008-6-30", "78-12-22", "8-6-21"</entry>
</row>
<row>
<entry>День, месяц и 4 цифры года с разделителем в виде точки, символа табуляции или дефиса</entry>
<entry><literal>dd</literal> [.\t-] <literal>mm</literal> [.-] <literal>YY</literal></entry>
<entry>"30-6-2008", "22.12.1978"</entry>
</row>
<row>
<entry>День, месяц и 2 цифры года с разделителем в виде точки или символа табуляции</entry>
<entry><literal>dd</literal> [.\t] <literal>mm</literal> "." <literal>yy</literal></entry>
<entry>"30.6.08", "22.12.78"</entry>
</row>
<row>
<entry>День, название месяца и год</entry>
<entry><literal>dd</literal> ([ \t.-])* <literal>m</literal> ([ \t.-])* <literal>y</literal></entry>
<entry>"30-June 2008", "22DEC78", "14 III 1879"</entry>
</row>
<row>
<entry>Название месяца и 4 цифры года (день месяца сбрасывается на 1)</entry>
<entry><literal>m</literal> ([ \t.-])* <literal>YY</literal></entry>
<entry>"June 2008", "DEC1978", "March 1879"</entry>
</row>
<row>
<entry>4 цифры года и название месяца (день месяца сбрасывается на 1)</entry>
<entry><literal>YY</literal> ([ \t.-])* <literal>m</literal></entry>
<entry>"2008 June", "1978-XII", "1879.MArCH"</entry>
</row>
<row>
<entry>Название месяца, день и год</entry>
<entry><literal>m</literal> ([ .\t-])* <literal>dd</literal> [,.stndrh\t ]+ <literal>y</literal></entry>
<entry>"July 1st, 2008", "April 17, 1790", "May.9,78"</entry>
</row>
<row>
<entry>Название месяца и день</entry>
<entry><literal>m</literal> ([ .\t-])* <literal>dd</literal> [,.stndrh\t ]*</entry>
<entry>"July 1st,", "Apr 17", "May.9"</entry>
</row>
<row>
<entry>День и название месяца</entry>
<entry><literal>dd</literal> ([ .\t-])* <literal>m</literal></entry>
<entry>"1 July", "17 Apr", "9.May"</entry>
</row>
<row>
<entry>Сокращённое название месяца, день и год</entry>
<entry><literal>M</literal> "-" <literal>DD</literal> "-" <literal>y</literal></entry>
<entry>"May-09-78", "Apr-17-1790"</entry>
</row>
<row>
<entry>Год, сокращённое название месяца и день</entry>
<entry><literal>y</literal> "-" <literal>M</literal> "-" <literal>DD</literal></entry>
<entry>"78-Dec-22", "1814-MAY-17"</entry>
</row>
<row>
<entry>Только год</entry>
<entry><literal>YY</literal></entry>
<entry>"1978", "2008"</entry>
</row>
<row>
<entry>Год (расширенный, 5-19 цифр со знаком)</entry>
<entry>[+-] <literal>YYY</literal></entry>
<entry>"-81120", "+20192"</entry>
</row>
<row>
<entry>Только название месяца</entry>
<entry><literal>m</literal></entry>
<entry>"March", "jun", "DEC"</entry>
</row>
</tbody>
</tgroup>
</table>
<table>
<title>Нотации ISO8601</title>
<tgroup cols="3">
<thead>
<row>
<entry>Описание</entry>
<entry>Формат</entry>
<entry>Примеры</entry>
</row>
</thead>
<tbody>
<row>
<entry>8 цифр (год, месяц и день)</entry>
<entry><literal>YY</literal> <literal>MM</literal> <literal>DD</literal></entry>
<entry>"15810726", "19780417", "18140517"</entry>
</row>
<row>
<entry>8 цифр (год, месяц и день) со слешем-разделителем</entry>
<entry><literal>YY</literal> "/" <literal>MM</literal> "/" <literal>DD</literal></entry>
<entry>"2008/06/30", "1978/12/22"</entry>
</row>
<row>
<entry>2 цифры года, месяц и день с дефисом-разделителем</entry>
<entry><literal>yy</literal> "-" <literal>MM</literal> "-" <literal>DD</literal></entry>
<entry>"08-06-30", "78-12-22"</entry>
</row>
<row>
<entry>4 цифры года с необязательным знаком, месяц и день</entry>
<entry>[+-]? <literal>YY</literal> "-" <literal>MM</literal> "-" <literal>DD</literal></entry>
<entry>"-0002-07-26", "+1978-04-17", "1814-05-17"</entry>
</row>
<row>
<entry>Пятизначный год с обязательным знаком, месяцем и днём</entry>
<entry>[+-] <literal>YYY</literal> "-" <literal>MM</literal> "-" <literal>DD</literal></entry>
<entry>"-81120-02-26", "+20192-04-17"</entry>
</row>
</tbody>
</tgroup>
</table>
<note>
<para>
Форматы <literal>y</literal> и <literal>yy</literal> для годов меньше 100 обрабатываются
в исключительных случаях при использовании символов <literal>y</literal> или
<literal>yy</literal>. Если год попадает в диапазон 0-69 (включительно), то к нему
добавляется 2000. Если же год принадлежит диапазону 70-99 (включительно), то к нему
добавляется 1900. Это означает, что дата "00-01-01" интерпретируется как "2000-01-01".
</para>
</note>
<note>
<para>
Формат "День, месяц и 2 цифры года с разделителем в виде точки или символа табуляции"
(<literal>dd</literal> [.\t] <literal>mm</literal> "." <literal>yy</literal>) работает только
для годов из диапазона 61-99 (включительно). За пределами этого диапазона отдаётся
предпочтение <emphasis>формату времени</emphasis> "<literal>HH</literal> [.:]
<literal>MM</literal> [.:] <literal>SS</literal>".
</para>
</note>
<note>
<para>
Формат "Только год" задействуется, только если строка времени была найдена.
В противном случае отдаётся предпочтению формату <literal>HH</literal> <literal>MM</literal>.
</para>
</note>
<caution>
<para>
Возможен выход за границы диапазона форматов <literal>dd</literal> и <literal>DD</literal>.
День месяца с порядковым номером 0 подразумевает последний день предыдущего месяца в
результате выхода за границы диапазона. Согласно написанному, "2008-08-00" равносильно
"2008-07-31", а "2008-06-31" соответствует "2008-07-01" (в июне всего 30 дней).
</para>
<para>
Обратите внимание, что диапазон дней ограничен 0-31, как указано выше
регулярным выражением. Так что, например, "2008-06-32" — некорректная дата.
</para>
<para>
Также допускается выход за границы диапазона для форматов <literal>mm</literal> и
<literal>MM</literal> со значением 0. Значение месяца 0 соответствует декабрю
предыдущего года. Например, дата "2008-00-22" равносильна "2007-12-22".
</para>
<para>
Если учесть два предыдущих замечания и выход за границы диапазона дней и месяцев,
получим следующее: дата "2008-00-00" в первую очередь преобразуется в "2007-12-00",
которая будет преобразована в "2007-11-30". То же случится с датой "0000-00-00", которая
будет преобразована к "-0001-11-30" (минус первый год в календаре ISO 8601 и 2 год до н. э. по
григорианскому календарю).
</para>
</caution>
</sect1>
<!--}}}-->
<!--Compound Formats: {{{-->
<sect1 annotations="chunk:false" xml:id="datetime.formats.compound">
<title>Составные форматов</title>
<para>
Эта страница описывает различные составные форматы даты и времени в BNF-подобном синтаксисе, которые понимает парсер
функций: <classname>DateTimeImmutable</classname>, <classname>DateTime</classname>,
<function>date_create</function>,
<function>date_create_immutable</function> и
<function>strtotime</function>.
</para>
<para>
Чтобы отформатировать объекты <classname>DateTimeImmutable</classname> и <classname>DateTime</classname>,
обратитесь к документации метода <function>DateTimeInterface::format</function>.
</para>
<table>
<title>Используемые символы</title>
<tgroup cols="3">
<thead>
<row>
<entry>Описание</entry>
<entry>Форматы</entry>
<entry>Примеры</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>DD</literal> (день месяца с ведущим нулём)</entry>
<entry>"0" [0-9] | [1-2][0-9] | "3" [01]</entry>
<entry>"02", "12", "31"</entry>
</row>
<row>
<entry><literal>doy</literal> (день в году)</entry>
<entry>"00"[1-9] | "0"[1-9][0-9] | [1-2][0-9][0-9] | "3"[0-5][0-9] | "36"[0-6]</entry>
<entry>"001", "012", "180", "350", "366"</entry>
</row>
<row>
<entry><literal>frac</literal> (дробная часть)</entry>
<entry>. [0-9]+</entry>
<entry>".21342", ".85"</entry>
</row>
<row>
<entry><literal>hh</literal> (часы)</entry>
<entry>"0"?[1-9] | "1"[0-2]</entry>
<entry>"04", "7", "12"</entry>
</row>
<row>
<entry><literal>HH</literal> (часы с ведущим нулём)</entry>
<entry>[01][0-9] | "2"[0-4]</entry>
<entry>"04", "07", "19"</entry>
</row>
<row>
<entry><literal>meridian</literal> (Ante meridiem или Post meridiem)</entry>
<entry>[AaPp] .? [Mm] .? [\0\t ]</entry>
<entry>"A.m.", "pM", "am."</entry>
</row>
<row>
<entry><literal>ii</literal> (минуты)</entry>
<entry>[0-5]?[0-9]</entry>
<entry>"04", "8", "59"</entry>
</row>
<row>
<entry><literal>II</literal> (минуты с ведущим нулём)</entry>
<entry>[0-5][0-9]</entry>
<entry>"04", "08", "59"</entry>
</row>
<row>
<entry><literal>M</literal> (сокращённое наименование месяца)</entry>
<entry>'jan' | 'feb' | 'mar' | 'apr' | 'may' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec'</entry>
<entry></entry>
</row>
<row>
<entry><literal>MM</literal> (месяц с ведущим нулём)</entry>
<entry>[0-1][0-9]</entry>
<entry>"00", "12"</entry>
</row>
<row>
<entry><literal>space</literal> (символ пробела или табуляции)</entry>
<entry>[ \t]</entry>
<entry></entry>
</row>
<row>
<entry><literal>ss</literal> (секунды)</entry>
<entry>([0-5]?[0-9])|60</entry>
<entry>"04", "8", "59", "60" (дополнительная секунда)</entry>
</row>
<row>
<entry><literal>SS</literal> (секунды с ведущим нулём)</entry>
<entry>[0-5][0-9]</entry>
<entry>"04", "08", "59"</entry>
</row>
<row>
<entry><literal>W</literal> (неделя в году)</entry>
<entry>"0"[1-9] | [1-4][0-9] | "5"[0-3]</entry>
<entry>"05", "17", "53"</entry>
</row>
<row>
<entry><literal>tzcorrection</literal> (смещение часового пояса)</entry>
<entry>"GMT"? [+-] <literal>hh</literal> ":"? <literal>II</literal>?</entry>
<entry>"+0400", "GMT-07:00", "-07:00"</entry>
</row>
<row>
<entry><literal>YY</literal> (4 цифры года)</entry>
<entry>[0-9]{4}</entry>
<entry>"2000", "2008", "1978"</entry>
</row>
</tbody>
</tgroup>
</table>
<table>
<title>Форматы стандартов</title>
<tgroup cols="2">
<thead>
<row>
<entry>Описание</entry>
<entry>Примеры</entry>
</row>
</thead>
<tbody>
<row>
<entry>ATOM</entry>
<entry>"2022-06-02T16:58:35+00:00"</entry>
</row>
<row>
<entry>COOKIE</entry>
<entry>"Thursday, 02-Jun-2022 16:58:35 UTC"</entry>
</row>
<row>
<entry>ISO8601</entry>
<entry>"2022-06-02T16:58:35+0000"</entry>
</row>
<row>
<entry><link xlink:href="&url.rfc;822">RFC 822</link></entry>
<entry>"Thu, 02 Jun 22 16:58:35 +0000"</entry>
</row>
<row>
<entry><link xlink:href="&url.rfc;850">RFC 850</link></entry>
<entry>"Thursday, 02-Jun-22 16:58:35 UTC"</entry>
</row>
<row>
<entry><link xlink:href="&url.rfc;1036">RFC 1036</link></entry>
<entry>"Thu, 02 Jun 22 16:58:35 +0000"</entry>
</row>
<row>
<entry><link xlink:href="&url.rfc;1123">RFC 1123</link></entry>
<entry>"Thu, 02 Jun 2022 16:58:35 +0000"</entry>
</row>
<row>
<entry><link xlink:href="&url.rfc;2822">RFC 2822</link></entry>
<entry>"Thu, 02 Jun 2022 16:58:35 +0000"</entry>
</row>
<row>
<entry><link xlink:href="&url.rfc;3339">RFC 3339</link></entry>
<entry>"2022-06-02T16:58:35+00:00"</entry>
</row>
<row>
<entry><link xlink:href="&url.rfc;3339">RFC 3339</link> Extended</entry>
<entry>"2022-06-02T16:58:35.698+00:00"</entry>
</row>
<row>
<entry><link xlink:href="&url.rfc;7231">RFC 7231</link></entry>
<entry>"Thu, 02 Jun 2022 16:58:35 GMT"</entry>
</row>
<row>
<entry>RSS</entry>
<entry>"Thu, 02 Jun 2022 16:58:35 +0000"</entry>
</row>
<row>
<entry>W3C</entry>
<entry>"2022-06-02T16:58:35+00:00"</entry>
</row>
</tbody>
</tgroup>
</table>
<table>
<title>Региональные нотации</title>
<tgroup cols="3">
<thead>
<row>
<entry>Описание</entry>
<entry>Формат</entry>
<entry>Примеры</entry>
</row>
</thead>
<tbody>
<row>
<entry>Общий формат log-записей</entry>
<entry><literal>dd</literal> "/" <literal>M</literal> "/" <literal>YY</literal> : <literal>HH</literal> ":" <literal>II</literal> ":" <literal>SS</literal> <literal>space</literal> <literal>tzcorrection</literal></entry>
<entry>"10/Oct/2000:13:55:36 -0700"</entry>
</row>
<row>
<entry>EXIF</entry>
<entry><literal>YY</literal> ":" <literal>MM</literal> ":" <literal>DD</literal> " " <literal>HH</literal> ":" <literal>II</literal> ":" <literal>SS</literal></entry>
<entry>"2008:08:07 18:11:31"</entry>
</row>
<row>
<entry>Год и неделя в формате ISO</entry>
<entry><literal>YY</literal> "-"? "W" <literal>W</literal></entry>
<entry>"2008W27", "2008-W28"</entry>
</row>
<row>
<entry>Год, неделя в формате ISO и день недели</entry>
<entry><literal>YY</literal> "-"? "W" <literal>W</literal> "-"? [0-7]</entry>
<entry>"2008W273", "2008-W28-3"</entry>
</row>
<row>
<entry>MySQL</entry>
<entry><literal>YY</literal> "-" <literal>MM</literal> "-" <literal>DD</literal> " " <literal>HH</literal> ":" <literal>II</literal> ":" <literal>SS</literal></entry>
<entry>"2008-08-07 18:11:31"</entry>
</row>
<row>
<entry>PostgreSQL: год и день в году</entry>
<entry><literal>YY</literal> "."? <literal>doy</literal></entry>
<entry>"2008.197", "2008197"</entry>
</row>
<row>
<entry>SOAP</entry>
<entry><literal>YY</literal> "-" <literal>MM</literal> "-" <literal>DD</literal> "T" <literal>HH</literal> ":" <literal>II</literal> ":" <literal>SS</literal> <literal>frac</literal> <literal>tzcorrection</literal>?</entry>
<entry>"2008-07-01T22:35:17.02", "2008-07-01T22:35:17.03+08:00"</entry>
</row>
<row>
<entry>Unix Timestamp</entry>
<entry>"@" "-"? [0-9]+</entry>
<entry>"@1215282385"</entry>
</row>
<row>
<entry>Метка времени Unix с микросекундами</entry>
<entry>"@" "-"? [0-9]+ "." [0-9]{0,6}</entry>
<entry>"@1607974647.503686"</entry>
</row>
<row>
<entry>XMLRPC</entry>
<entry><literal>YY</literal> <literal>MM</literal> <literal>DD</literal> "T" <literal>hh</literal> ":" <literal>II</literal> ":" <literal>SS</literal></entry>
<entry>"20080701T22:38:07", "20080701T9:38:07"</entry>
</row>
<row>
<entry>XMLRPC (Compact)</entry>
<entry><literal>YY</literal> <literal>MM</literal> <literal>DD</literal> 't' <literal>hh</literal> <literal>II</literal> <literal>SS</literal></entry>
<entry>"20080701t223807", "20080701T093807"</entry>
</row>
<row>
<entry>WDDX</entry>
<entry><literal>YY</literal> "-" <literal>mm</literal> "-" <literal>dd</literal> "T" <literal>hh</literal> ":" <literal>ii</literal> ":" <literal>ss</literal></entry>
<entry>"2008-7-1T9:3:37"</entry>
</row>
</tbody>
</tgroup>
</table>
<note>
<para>
Символ "W" в форматах "Год и неделя в формате ISO" и "Год, неделя в формате ISO и день
недели" чувствителен к регистру, допускается использование символа "W" только в верхнем
регистре.
</para>
<para>
Символ "T" в форматах SOAP, XMLRPC и WDDX также чувствителен к регистру, допускается
использование символа "T" только в верхнем регистре.
</para>
<para>
Формат "Unix Timestamp" устанавливает часовой пояс в UTC.
</para>
</note>
</sect1>
<!--}}}-->
<!--Relative Formats: {{{-->
<sect1 annotations="chunk:false" xml:id="datetime.formats.relative">
<title>Относительные форматы</title>
<para>
Эта страница описывает относительные форматы даты и времени в BNF-подобном синтаксисе, которые понимает парсер
функций: <classname>DateTimeImmutable</classname>, <classname>DateTime</classname>,
<function>date_create</function>,
<function>date_create_immutable</function> и
<function>strtotime</function>.
</para>
<para>
Чтобы отформатировать объекты <classname>DateTimeImmutable</classname> и <classname>DateTime</classname>,
обратитесь к документации метода <function>DateTimeInterface::format</function>.
</para>
<table>
<title>Используемые символы</title>
<tgroup cols="2">
<thead>
<row>
<entry>Описание</entry>
<entry>Формат</entry>
</row>
</thead>
<tbody>
<row>
<entry><literal>dayname</literal> (наименование дня недели)</entry>
<entry>'sunday' | 'monday' | 'tuesday' | 'wednesday' | 'thursday' |
'friday' | 'saturday' | 'sun' | 'mon' | 'tue' | 'wed' | 'thu' | 'fri' |
'sat'</entry>
</row>
<row>
<entry><literal>daytext</literal> (интервалы в неделях)</entry>
<entry>'weekday' | 'weekdays'</entry>
</row>
<row>
<entry><literal>number</literal></entry>
<entry>[+-]?[0-9]+</entry>
</row>
<row>
<entry><literal>ordinal</literal> (порядковые числительные и указатели)</entry>
<entry>'first' | 'second' | 'third' | 'fourth' | 'fifth' | 'sixth' |
'seventh' | 'eighth' | 'ninth' | 'tenth' | 'eleventh' | 'twelfth' |
'next' | 'last' | 'previous' | 'this'</entry>
</row>
<row>
<entry><literal>reltext</literal> (указатели)</entry>
<entry>'next' | 'last' | 'previous' | 'this'</entry>
</row>
<row>
<entry><literal>space</literal> (символы пробела и табуляции)</entry>
<entry>[ \t]+</entry>
</row>
<row>
<entry><literal>unit</literal> (интервалы)</entry>
<entry>
'ms' | 'µs' | (( 'msec' | 'millisecond' | 'µsec' | 'microsecond'
| 'usec' | 'sec' | 'second' | 'min' | 'minute' | 'hour' | 'day' |
'fortnight' | 'forthnight' | 'month' | 'year') 's'?) | 'weeks' |
<literal>daytext</literal>
</entry>
</row>
</tbody>
</tgroup>
</table>
<table>
<title>Нотации, основанные на днях</title>
<tgroup cols="3">
<thead>
<row>
<entry>Формат</entry>
<entry>Описание</entry>
<entry>Примеры</entry>
</row>
</thead>
<tbody>
<row>
<entry>'yesterday'</entry>
<entry>Полночь вчера</entry>
<entry>"yesterday 14:00"</entry>
</row>
<row>
<entry>'midnight'</entry>
<entry>Время устанавливается в 00:00:00</entry>
<entry></entry>
</row>
<row>
<entry>'today'</entry>
<entry>Время устанавливается в 00:00:00</entry>
<entry></entry>
</row>
<row>
<entry>'now'</entry>
<entry>Текущее время</entry>
<entry></entry>
</row>
<row>
<entry>'noon'</entry>
<entry>Время устанавливается в 12:00:00</entry>
<entry>"yesterday noon"</entry>
</row>
<row>
<entry>'tomorrow'</entry>
<entry>Полночь завтра</entry>
<entry></entry>
</row>
<row>
<entry>'back of' <literal>hour</literal></entry>
<entry>15 минут заданного часа</entry>
<entry>"back of 7pm", "back of 15"</entry>
</row>
<row>
<entry>'front of' <literal>hour</literal></entry>
<entry>Без 15 минут заданный час</entry>
<entry>"front of 5am", "front of 23"</entry>
</row>
<row>
<entry>'first day of'</entry>
<entry>
Устанавливает первый день текущего месяца. Обычно эту нотацию лучше использовать
вместе с названием месяца, следующим за ней, иначе будет учитываться текущий месяц.
</entry>
<entry>"first day of January 2008"</entry>
</row>
<row>
<entry>'last day of'</entry>
<entry>
Устанавливает последний день текущего месяца. Обычно эту нотацию лучше использовать
вместе с названием месяца, следующим за ней, иначе будет учитываться текущий месяц.
</entry>
<entry>"last day of next month"</entry>
</row>
<row>
<entry><literal>ordinal</literal> <literal>space</literal> <literal>dayname</literal> <literal>space</literal> 'of'</entry>
<entry>Вычисляет <literal>x</literal> день недели текущего или заданного месяца.</entry>
<entry>"first sat of July 2008"</entry>
</row>
<row>
<entry>'last' <literal>space</literal> <literal>dayname</literal> <literal>space</literal> 'of'</entry>
<entry>Вычисляет <emphasis>последний</emphasis> день недели текущего или заданного месяца.</entry>
<entry>"last sat of July 2008"</entry>
</row>
<row>
<entry><literal>number</literal> <literal>space</literal>? (<literal>unit</literal> | 'week')</entry>
<entry>Вычисляет относительное время при использовании числовых значений периода.</entry>
<entry>"+5 weeks", "12 day", "-7 weekdays"</entry>
</row>
<row>
<entry>(<literal>ordinal</literal> | <literal>reltext</literal>) <literal>space</literal> <literal>unit</literal></entry>
<entry>Вычисляет относительное время при использовании строковых значений периода.
<literal>last</literal> и <literal>previous</literal> то же, что и
<literal>-1</literal>, <literal>this</literal> ни на что не влияет, а
<literal>next</literal> <literal>+1</literal>.
</entry>
<entry>"fifth day", "second month", "last day", "previous year"</entry>
</row>
<row>
<entry>'ago'</entry>
<entry>Вычитает все значения из последнего полученного момента времени.</entry>
<entry>"2 days ago", "8 days ago 14:00", "2 months 5 days ago", "2 months ago 5 days", "2 days ago ago"</entry>
</row>
<row>
<entry><literal>dayname</literal></entry>
<entry>
Перемещается на следующий день указанного дня недели. (Смотрите <link linkend="datetime.formats.relative.dayname-note">замечание</link>)
</entry>
<entry>"Monday"</entry>
</row>
<row>
<entry><literal>reltext</literal> <literal>space</literal> 'week'</entry>
<entry>Разбирает специфичный формат "weekday + last/this/next week".</entry>
<entry>"Monday next week"</entry>
</row>
</tbody>
</tgroup>
</table>
<note>
<para>
Относительные выражения всегда обрабатываются <emphasis>после</emphasis> не являющихся относительными.
Например, "+1 week july 2008" эквивалентно "july 2008 +1 week".
</para>
<para>
Исключением этого правила являются: "yesterday", "midnight", "today", "noon" и "tomorrow".
Записи "tomorrow 11:00" и "11:00 tomorrow" отличаются. Если принять сегодняшнюю дату за "July 23rd, 2008",
то первая запись возвращает "2008-07-24 11:00", а вторая "2008-07-24 00:00". Причина такого поведения в том,
что эти пять выражений влияют непосредственно на время.
</para>
<para>
Такие ключевые слова, как "first day of", зависят от контекста, в котором используется строка относительного формата.
Если она используется в статическом методе или функции, то референтом является текущая системная метка времени.
Однако при использовании в методе <function>DateTime::modify</function> или
<function>DateTimeImmutable::modify</function>,
референтом является объект, на котором вызывается метод <literal>modify()</literal>.
</para>
</note>
<note>
<para xml:id="datetime.formats.relative.dayname-note">
Следует обратить внимание на приведённые ниже замечания относительно текущего дня недели и дня недели,
указанного в строке даты и времени. Текущий день недели может быть вычислен из независимой части строки
даты и времени.
</para>
<orderedlist>
<listitem>
<simpara>
"<literal>dayname</literal>" <emphasis>не</emphasis> сдвигает дату на другой день.
(Например: "Wed July 23rd, 2008" означает "2008-07-23").
</simpara>
</listitem>
<listitem>
<simpara>
"<literal>number</literal> <literal>dayname</literal>" <emphasis>не</emphasis> сдвигает дату
на другой день. (Например: "1 wednesday july 23rd, 2008" означает "2008-07-23").
</simpara>
</listitem>
<listitem>
<simpara>
"<literal>number</literal> week <literal>dayname</literal>" добавляет соответствующее число недель,
но <emphasis>не</emphasis> сдвигает дату на другой день. В этом случае имеют место два различных блока
"<literal>number</literal> week" и "<literal>dayname</literal>".
(Например: "+1 week wednesday july 23rd, 2008" означает "2008-07-30").
</simpara>
</listitem>
<listitem>
<simpara>
"<literal>ordinal</literal> <literal>dayname</literal>" <emphasis>сдвигает</emphasis> дату
на другой день. (Например: "last wednesday july 23rd, 2008" означает "2008-07-30").
</simpara>
</listitem>
<listitem>
<simpara>
"<literal>number</literal> week <literal>ordinal</literal> <literal>dayname</literal>"
добавляет соответствующее число недель, а после <emphasis>сдвигает</emphasis> дату на другой день.
В этом случае имеют место два различных блока "<literal>number</literal> week" и
"<literal>ordinal</literal> <literal>dayname</literal>".
(Например: "+1 week first wednesday july 23rd, 2008" означает "2008-08-06").
</simpara>
</listitem>
<listitem>
<simpara>
"<literal>ordinal</literal> <literal>dayname</literal> 'of' " <emphasis>не</emphasis> сдвигает дату
на другой день. (Например: "first wednesday of july 23rd, 2008" означает "2008-07-02", потому как
определённые фразы с 'of' сбрасывают день месяца на '1' и в этом случае игнорируется '23rd').
</simpara>
</listitem>
</orderedlist>
<para>
Также следует обратить внимание, что "of" в "<literal>ordinal</literal>
<literal>space</literal> <literal>dayname</literal>
<literal>space</literal> 'of' " и "'last' <literal>space</literal>
<literal>dayname</literal> <literal>space</literal> 'of' " имеет особый смысл.
</para>
<orderedlist>
<listitem>
<simpara>
Устанавливает день месяца в 1.
</simpara>
</listitem>
<listitem>
<simpara>
"<literal>ordinal</literal> <literal>dayname</literal> 'of' "<emphasis>не</emphasis> сдвигает дату
на другой день. (Например: "first tuesday of july 2008" означает "2008-07-01").
</simpara>
</listitem>
<listitem>
<simpara>
"<literal>ordinal</literal> <literal>dayname</literal>" <emphasis>сдвигает</emphasis> дату на другой день.
(Например: "first tuesday july 2008" означает "2008-07-08", смотрите также 4-й пункт предыдущего замечания).
</simpara>
</listitem>
<listitem>
<simpara>
"'last' <literal>dayname</literal> 'of' " получает последний в месяце <literal>dayname</literal>.
(Например: "last wed of july 2008" означает "2008-07-30")
</simpara>
</listitem>
<listitem>
<simpara>
"'last' <literal>dayname</literal>" получает последний <literal>dayname</literal> перед текущим днём.
(Например: "last wed july 2008" означает "2008-06-25"; "july 2008" устанавливает дату в "2008-07-01",
а после "last wed" смещает дату к предыдущей среде, а именно к "2008-06-25").
</simpara>
</listitem>
</orderedlist>
</note>
<note>
<para>
Относительные значения в месяцах рассчитываются исходя из их продолжительности.
Например, из "+2 month 2011-11-30" получится "2012-01-30".
Это связано с тем, что ноябрь состоит из 30 дней, а декабрь из 31 дня, что составляет 61 дней.
</para>
</note>
<note>
<para>
Под числом (<literal>number</literal>) подразумевается целое число
(<emphasis>integer</emphasis>); Если будет указано десятичное число, то
десятичная точка (или запятая) будет рассматриваться как разделитель.
К примеру, <literal>'+1.5 hours'</literal> будет считаться как
<literal>'+1 5 hours'</literal>, а не <literal>'+1 hour +30 minutes'</literal>.
</para>
</note>
<sect2 role="changelog">
&reftitle.changelog;
<para>
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>8.2.0</entry>
<entry>
Символы <literal>number</literal> больше не принимают несколько знаков,
например, <literal>+-2</literal>.
</entry>
</row>
<row>
<entry>7.0.8</entry>
<entry>
Недели всегда начинаются с понедельника. Ранее можно было определять
начало недели с воскресенья.
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</para>
</sect2>
</sect1>
<!--}}}-->
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=marker fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->