1
0
mirror of https://github.com/php/doc-ja.git synced 2026-03-28 00:52:12 +01:00
Files
archived-doc-ja/reference/datetime/formats.xml
2025-11-01 00:38:03 +09:00

1290 lines
46 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 3a8c3e77df070a046c9d5b56b68926ca2d7e5ee3 Maintainer: takagi Status: ready -->
<!-- CREDITS: hnw,mumumu -->
<chapter xml:id="datetime.formats" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>サポートする日付と時刻の書式</title>
<para>
この節では
<classname>DateTimeImmutable</classname>, <classname>DateTime</classname>,
<function>date_create_immutable</function>, <function>date_create</function>, <function>date_parse</function>
および <function>strtotime</function> が解釈可能な、全てのBNFライクな書式について説明します。
これらの書式はセクションごとにグループ分けされています。
たいていの場合、一つの日付・時刻文字列の中でホワイトスペース、
コンマまたはドットで区切られた異なるセクションの書式を併用することができます。
それぞれの書式について、説明と一緒に1個以上の例を示してあります。
シングルクォートで囲まれたフォーマットは大文字小文字を区別しません。
(<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 は "60" を不正な秒として扱う UnixTime を実装しているため、
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>
このページでは、
<classname>DateTimeImmutable</classname>, <classname>DateTime</classname>,
<function>date_create</function>,
<function>date_create_immutable</function>, そして
<function>strtotime</function> のパーサーが理解する、
BNFライクな時刻フォーマットを説明します。
</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></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></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>時、午前/午後</entry>
<entry><literal>hh</literal> <literal>space</literal>? <literal>meridian</literal></entry>
<entry>"4 am", "5PM"</entry>
</row>
<row>
<entry>時、分、午前/午後</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>時、分、秒、午前/午後</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 (時、分、秒、端数、午前/午後)</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>
このページでは、
<classname>DateTimeImmutable</classname>, <classname>DateTime</classname>,
<function>date_create</function>,
<function>date_create_immutable</function> および
<function>strtotime</function>
のパーサーが理解する、
BNFライクな日付フォーマットを説明します。
</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></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></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></entry>
<entry>[0-9]{2}</entry>
<entry>"00", "08", "78"</entry>
</row>
<row>
<entry><literal>YY</literal></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\t12.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>ISO 8601 に準拠した表記法</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>スラッシュで区切られた、4桁の年、月、日</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>符号が必須。5桁の年、月、日</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未満の年は特別な扱いになります。年が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>
書式「年 (年だけの指定)」は、時刻の指定が先に出現している場合のみ機能します。
そうでない場合、指定された4桁が
<literal>HH</literal> <literal>MM</literal>
にマッチした場合にこれらふたつの日付要素が代わりに設定されます。
</para>
<para>
年だけの指定を一貫してパースしたい場合は、
<literal>Y</literal> を指定して
<function>DateTimeImmutable::createFromFormat</function>
を使ってください。
</para>
</note>
<caution>
<para>
シンボル <literal>dd</literal><literal>DD</literal> について、
オーバーフローやアンダーフローすることができます。
つまり、 0 日は先月の最終日の意味になりますし、
オーバーフローすると翌月に繰り越しになります。
このルールにより、"2008-08-00" は "2008-07-31" と同一になり、
"2008-06-31" は "2008-07-01" と同一になります
( 6 月は 30 日までしかないので)。
</para>
<para>
「日」の範囲が 0 から 31 までに絞られていることに注意しましょう。
先ほどの正規表現が示すとおりです。
したがって、たとえば "2008-06-32" は日付文字列として妥当な形式ではなくなります。
</para>
<para>
また、シンボル <literal>mm</literal><literal>MM</literal> についても
0 を用いてアンダーフローすることができます。
0 月は前年の 12 月を意味します。
たとえば "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 における -1 年は、予測的グレゴリオ暦 (proleptic Gregorian calendar)
で言うところの紀元前 2 年になります。)
</para>
</caution>
</sect1>
<!--}}}-->
<!--Compound Formats: {{{-->
<sect1 annotations="chunk:false" xml:id="datetime.formats.compound">
<title>複合的な書式</title>
<para>
このページでは、
<classname>DateTimeImmutable</classname>, <classname>DateTime</classname>,
<function>date_create</function>,
<function>date_create_immutable</function> および
<function>strtotime</function> のパーサーが理解する、
BNFライクな日付/時刻 複合フォーマットを説明します。
</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></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></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>Common Log Format</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 の年、 ISO の週番号</entry>
<entry><literal>YY</literal> "-"? "W" <literal>W</literal></entry>
<entry>"2008W27", "2008-W28"</entry>
</row>
<row>
<entry>ISO の年、 ISO の週番号、 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 タイムスタンプ</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 (短縮形)</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>
書式「 ISO の年、 ISO の週番号」と
「 ISO の年、 ISO の週番号、 ISO の曜日番号」で使われている
"W" は大文字小文字を区別します。大文字の "W" だけが利用できます。
</para>
<para>
「 SOAP 」、「 XMLRPC 」および「 WDDX 」の各書式中の
"T" は大文字小文字を区別します。大文字の "T" だけが利用できます。
</para>
<para>
書式「 Unix タイムスタンプ 」は、タイムゾーンを UTC に設定します。
</para>
<para>
(訳注)書式「 Common Log Format 」は、 Apache ログにおける時刻の書式です。
</para>
<para>
(訳注)書式「 ISO の年、 ISO の週番号」と
「 ISO の年、 ISO の週番号、 ISO の曜日番号」は、
ISO 8601で規定されている表記法です。
定義上、週が前年あるいは翌年に属すことがあるので注意してください。
たとえば、 ISO 8601 の定義では
2010 年の第 1 週は 1 月 3 日から 1 月 9 日までとなり、
2010 年の 1 月 1 日と 1 月 2 日は 2009 年の第 53 週に属します。
</para>
</note>
</sect1>
<!--}}}-->
<!--Relative Formats: {{{-->
<sect1 annotations="chunk:false" xml:id="datetime.formats.relative">
<title>相対的な書式</title>
<para>
このページでは、
<classname>DateTimeImmutable</classname>,
<classname>DateTime</classname>,
<function>date_create</function>,
<function>date_create_immutable</function>, そして
<function>strtotime</function> のパーサーが理解する、
BNFライクな相対日付/時刻フォーマットを説明します。
</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>昨日の00:00:00</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>明日の00:00:00</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"</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" は異なります。
たとえば、今日が2008年7月23日だとしましょう。
このときの1つ目の結果は "2008-07-24 11:00" ですが、
2つ目の方は "2008-07-24 00:00" となります。
このような結果になる理由は、
これら5つの記述が現在時刻に直接影響するためです。
</para>
<para>
"first day of" のようなキーワードは、
相対的な書式文字列が使われるコンテクストに依存します。
static メソッドや関数で使われた場合、
参照されるのは現在のタイムスタンプですが、
<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>" は 2 つの別個のブロックとなります。
(例: "+1 week wednesday july 23rd, 2008" は "2008-07-30" の意味です。)
</simpara>
</listitem>
<listitem>
<simpara>
"<literal>ordinal</literal> <literal>dayname</literal>"
は、日付を別の日まで進め<emphasis>ます</emphasis>
(例: "first 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>"
は2つの別個のブロックとなります。
(例: "+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'を含む一連の語群 'first wednesday of july' が
相対的な書式として処理されることで
日付を同月の '1' 日にリセットしてしまい、'23rd' は無視されてしまうのです。)
</simpara>
</listitem>
</orderedlist>
<para>
また、書式 "<literal>ordinal</literal>
<literal>space</literal> <literal>dayname</literal>
<literal>space</literal> 'of' " と "'last' <literal>space</literal>
<literal>dayname</literal> <literal>space</literal> 'of' "
に含まれる "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" となります。
11 月の日数は 30 日、12 月の日数は 31 日なので、
その合計である 61 日後となるわけです。
</para>
</note>
<note>
<para>
<literal>number</literal><emphasis>整数値</emphasis> です。
つまり、小数値が与えられると、ドット(またはコンマ) はデリミタとして解釈されがちです。
たとえば、<literal>'+1.5 hours'</literal>
<literal>'+1 hour +30 minutes'</literal> ではなく
<literal>'+1 5 hours'</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.4.0</entry>
<entry>
<literal>number</literal> シンボルは、
再びプラス符号の後に、マイナス符号を受け入れるようになりました。
たとえば、<literal>+-2</literal> のようなフォーマットや、
他の複数の符号の組み合わせです。
</entry>
</row>
<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
-->