CakeFest 2017 NYC, the Official CakePHP Conference

日付の書式

このページでは、 strtotime()DateTime そして date_create() のパーサーが理解する、 さまざまな日付フォーマットを説明します。

シンボル一覧
シンボル 書式
daysuf "st" | "nd" | "rd" | "th"  
dd ([0-2]?[0-9] | "3"[01]) daysuf? "7th", "22nd", "31"
DD "0" [0-9] | [1-2][0-9] | "3" [01] "07", "31"
m 'january' | 'february' | 'march' | 'april' | 'may' | 'june' | 'july' | 'august' | 'september' | 'october' | 'november' | 'december' | 'jan' | 'feb' | 'mar' | 'apr' | 'may' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec' | "I" | "II" | "III" | "IV" | "V" | "VI" | "VII" | "VIII" | "IX" | "X" | "XI" | "XII"  
M 'jan' | 'feb' | 'mar' | 'apr' | 'may' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec'  
mm "0"? [0-9] | "1"[0-2] "0", "04", "7", "12"
MM "0" [0-9] | "1"[0-2] "00", "04", "07", "12"
y [0-9]{1,4} "00", "78", "08", "8", "2008"
yy [0-9]{2} "00", "08", "78"
YY [0-9]{4} "2000", "2008", "1978"
各国ごとの表記法
説明 書式
アメリカ式の月、日 mm "/" dd "5/12", "10/27"
アメリカ式の月、日、年 mm "/" dd "/" y "12/22/78", "1/17/2006", "1/17/6"
スラッシュで区切られた、4桁の年、月、日 YY "/" mm "/" dd "2008/6/30", "1978/12/22"
4桁の年、月 (GNU) YY "-" mm "2008-6", "2008-06", "1978-12"
ハイフンで区切られた、年、月、日 y "-" mm "-" dd "2008-6-30", "78-12-22", "8-6-21"
ドットかタブかハイフンで区切られた、日、月、4桁の年 dd [.\t-] mm [.-] YY "30-6-2008", "22.12.1978"
ドットかタブで区切られた、日、月、2桁の年 dd [.\t] mm "." yy "30.6.08", "22\t12.78"
日、月の文字表記、年 dd ([ \t.-])* m ([ \t.-])* y "30-June 2008", "22DEC78", "14 III 1879"
月の文字表記、4桁の年 (日は1日にリセットされる) m ([ \t.-])* YY "June 2008", "DEC1978", "March 1879"
4桁の年、月の文字表記 (日は1日にリセットされる) YY ([ \t.-])* m "2008 June", "1978-XII", "1879.MArCH"
月の文字表記、日、年 m ([ .\t-])* dd [,.stndrh\t ]+ y "July 1st, 2008", "April 17, 1790", "May.9,78"
月の文字表記、日 m ([ .\t-])* dd [,.stndrh\t ]* "July 1st,", "Apr 17", "May.9"
日、月の文字表記 d ([ .\t-])* m "1 July", "17 Apr", "9.May"
月の省略形、日、年 M "-" DD "-" y "May-09-78", "Apr-17-1790"
年、月の省略形、日 y "-" M "-" DD "78-Dec-22", "1814-MAY-17"
年 (年だけの指定) YY "1978", "2008"
月の文字表記 (月だけの指定) m "March", "jun", "DEC"
ISO 8601 に準拠した表記法
説明 書式
年、月、日の8桁 YY MM DD "15810726", "19780417", "18140517"
スラッシュで区切られた、4桁の年、月、日 YY "/" MM "/" DD "2008/06/30", "1978/12/22"
ハイフンで区切られた、2桁の年、月、日 yy "-" MM "-" DD "08-06-30", "78-12-22"
符号つきまたは符号なしの4桁の年、月、日 [+-]? YY "-" MM "-" DD "-0002-07-26", "+1978-04-17", "1814-05-17"

注意:

シンボル y または yy を含む書式について、 100未満の年は特別な扱いになります。年が0から69までの間だった場合、 2000を足した数になります。 また、年が70から99までの間だった場合、1900を足した数になります。 つまり、"00-01-01" は "2000-01-01" と解釈されます。

注意:

書式「ドットかタブで区切られた、日、月、2桁の年」 (dd [.\t] mm "." yy) は年が61から99の間のときだけ機能します。 この範囲外の年を与えた場合には 時刻の書式 の "HH [.:] MM [.:] SS" が優先されます。

注意:

書式「年 (年だけの指定)」は、時刻の指定が先に出現している場合のみ機能します。 そうでない場合、指定された4桁は HH MM とみなされます。

注意:

シンボル ddDD について、 オーバーフローやアンダーフローすることができます。 つまり、 0 日は先月の最終日の意味になりますし、 オーバーフローすると翌月に繰り越しになります。 このルールにより、"2008-08-00" は "2008-07-31" と同一になり、 "2008-06-31" は "2008-07-01" と同一になります ( 6 月は 30 日までしかないので)。

PHP 5.1.0 以降では「日」の範囲が 0 から 31 までに絞られたことに注意しましょう。 先ほどの正規表現が示すとおりです。 したがって、たとえば "2008-06-32" は日付文字列として妥当な形式ではなくなります。

また、シンボル mmMM についても 0 を用いてアンダーフローすることができます。 0 月は前年の 12 月を意味します。 たとえば "2008-00-22" は "2007-12-22" と同一です。

もしこれらを併用し、日も月もアンダーフローした場合は次のようになります。 "2008-00-00" は、まず "2007-12-00" へと変換され、 さらに "2007-11-30" へと変換されます。 文字列 "0000-00-00" についても同様に "-0001-11-30" へと変形されます。 (ISO 8601 における -1 年は、予測的グレゴリオ暦 (proleptic Gregorian calendar) で言うところの紀元前 2 年になります。)

add a note add a note

User Contributed Notes 3 notes

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

September 15th at 6:12 PM

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

September 15th (6:12:14 PM)

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

function fullstrtotime ($time) {
  return strtotime(str_replace(array(" at", "(", ")"), "", $time));
}
up
-39
Anonymous
1 year ago
Note: the day (dd or DD) is first checked for range 0..31 and only if it fits, the overflow and underflow mechanism may apply. If not, strtotime() simply returns false.
If you need unlimited over/underflow for date calculations (for example 2015-01-40 to 2015-02-09), use mktime() instead.
To Top