関数索引
parseDate() 関数は任意の形式の日付表現を対応する数値形式に変換します。
変換結果として返される値は、指定された時刻表現と、1970/01/01 00:00:00 GMTとの差をミリ秒単位で表したた値となります。1970/01/01 00:00:00 GMT 以前の時刻表現は負の値となります。
parseDate() 関数の戻り値を formatDate() 関数で加工することで、任意の時刻表現に変換することができます。
変換したい時刻表現を指定します。時刻表現は、フォーマット指定に準じた形式でなければなりません。指定したフォーマットに従っていない時刻表現を与えた場合には parseDate() 関数は null を返します。(下記の利用例も参照してください)
フォーマット指定:パース(解析)する時刻表現の形を指定します。parseDate() 関数は、いろいろな形式の時刻表現をパースすることができますが、パースする時刻表現の形式は引数として指定しなければなりません。
フォーマットの指定は、下表に定義されている「フォーマット文字」を組み合わせた文字列で行ないます。
フォーマット指定中のすべてのアルファベット (a-z と A-Z) は、すべて「フォーマット文字」として扱われます。下表にない文字をフォーマット文字として使用するとエラーとなります。
フォーマット文字として扱われない文字(例えば - や / 記号など)をフォーマット指定中に置くと、時刻表現の対応する位置にその文字があるものとしてパースが行なわれます。対応する位置にその文字がない場合パースは失敗し parseDate() 関数の戻り値は null となります。
アルファベット文字を、フォーマット文字としてではなく、その位置にその文字があることを要求するために使用したい場合には、それらの文字を ' (シングルクオート)で囲って使います。例えば "yyyy-MM-dd'T'HH:mm:ss.SSSZ" というフォーマット指定を行なうことで、年月日と時刻の間に T を1文字要求するフォーマット指定が行なえます。
シングルクオート自体をフォーマット指定中に置きたい場合には、例えば "hh 'o''clock' a, zzzz" のように、シングルクオートを二つ続けて指定してください。
下表の「パース結果」欄の値は、formatDate() 関数のパラメタ「タイムゾーン」に "GMT" (世界標準時)を指定した場合のパース結果です。つまり parseDate() 関数に与える日付表現の中にタイムゾーン情報が含まれていない場合に、その日付表現が GMT で表現されているものとして解釈した場合のパース結果となっています。
フォーマット文字 | 意味 | 使用例 | 入力 | 言語 | パース結果 (GMT) |
---|---|---|---|---|---|
G | 西暦/紀元前 | G y/M/d | 西暦 2009/2/3 AD 2008/3/4 紀元前 5000/1/1 BC 1215/3/7 |
ja en ja en |
AD 2009/02/03 00:00:00 AD 2008/03/04 00:00:00 BC 5000/01/01 00:00:00 BC 1215/03/07 00:00:00 |
y | 年 | y/M/d | 09/2/15 97/5/22 123/3/11 1234/5/6 2/3/4 |
AD 2009/02/15 00:00:00 AD 1997/05/22 00:00:00 AD 0123/03/11 00:00:00 AD 1234/05/06 00:00:00 AD 0002/03/04 00:00:00 |
|
yyy | 年 | yyy/M/d | 2008/12/31 09/3/9 |
AD 2008/12/31 00:00:00 AD 0009/03/09 00:00:00 |
|
M | 月(数字) | y/M/d | 2009/3/10 2009/05/09 2009/12/13 |
AD 2009/03/10 00:00:00 AD 2009/05/09 00:00:00 AD 2009/12/13 00:00:00 |
|
MMM | 月名 | y/MMM/d | 2006/Jul/3 1975/December/3 2001/Октябрь/22 |
en en ru |
AD 2006/07/03 00:00:00 AD 1975/12/03 00:00:00 AD 2001/10/22 00:00:00 |
w | 年初から X 週めの 初日(日曜日) |
y(w) | 2000(1) 2000(2) 2007(53) |
AD 1999/12/26 00:00:00 AD 2000/01/02 00:00:00 AD 2007/12/30 00:00:00 |
|
W | 月初から X 週めの 初日(日曜日) |
y/M(W) | 2002/8(1) 2007/12(4) |
AD 2002/07/28 00:00:00 AD 2007/12/16 00:00:00 |
|
D | 年初から X 日め | y(D) | 2004(365) 2007(1) |
AD 2004/12/30 00:00:00 AD 2007/01/01 00:00:00 |
|
d | 日 | y/M/d | 2004/12/23 2004/12/1 |
AD 2004/12/23 00:00:00 AD 2004/12/01 00:00:00 |
|
a | 午前/午後 | y/M/d a | 2006/12/13 am 2006/12/13 pm 2006/12/13 午前 2006/12/13 午後 |
en en ja ja |
AD 2006/12/13 00:00:00 AD 2006/12/13 12:00:00 AD 2006/12/13 00:00:00 AD 2006/12/13 12:00:00 |
H | 時 (0-23) |
y/M/d H:m:s | 2004/12/23 00:00:00 2004/12/1 1:2:3 |
AD 2004/12/23 00:00:00 AD 2004/12/01 01:02:03 |
|
k | 時 (0-24 24は0) |
y/M/d k:m:s | 2004/12/23 00:00:00 2004/12/23 24:00:00 AD 2004/12/23 16:01:02 |
AD 2004/12/23 00:00:00 AD 2004/12/23 00:00:00 2004/12/23 16:01:02 |
|
K | 午前/午後の時 (0-11) |
y/M/d a K:m:s | 1960/3/7 AM 00:02:03 1960/3/7 AM 11:02:03 1960/3/7 PM 00:02:03 1960/3/7 PM 11:02:03 |
en en en en |
AD 1960/03/07 00:02:03 AD 1960/03/07 11:02:03 AD 1960/03/07 12:02:03 AD 1960/03/07 23:02:03 |
h | 午前/午後の時 (0-12 12は0) |
y/M/d a h:m:s | 1960/3/7 AM 00:02:03 1960/3/7 AM 12:02:03 1960/3/7 AM 01:02:03 1960/3/7 PM 00:02:03 1960/3/7 PM 12:02:03 1960/3/7 PM 01:02:03 |
en en en |
AD 1960/03/07 00:02:03 AD 1960/03/07 00:02:03 AD 1960/03/07 01:02:03 AD 1960/03/07 12:02:03 AD 1960/03/07 12:02:03 AD 1960/03/07 13:02:03 |
m | 分(0-59) | y/M/d H:m:s | 2008/10/11 21:22:34 | AD 2008/10/11 21:22:34 | |
s | 秒(0-59) | y/M/d H:m:s | 2008/10/11 21:22:34 | AD 2008/10/11 21:22:34 | |
S | ミリ秒(0-999) | y/M/d H:m:s.S | 2008/10/11 21:22:34.789 | AD 2008/10/11 21:22:34.789 | |
z | タイムゾーン | y/M/d H:m:s z | 2008/3/7 10:22:34 JST 2007/10/11 00:00:00 EST 2007/10/11 00:00:00 日本標準時 2007/10/11 02:03:04 グリニッジ標準時 |
en en ja ja |
AD 2008/03/07 01:22:34 AD 2007/10/11 05:00:00 AD 2007/10/10 15:00:00 AD 2007/10/11 02:03:04 |
Z | RFC 822 タイムゾーン {+|-}NNNN |
y/M/d H:m:s Z | 2008/3/7 10:22:34 +0900 2007/10/11 00:00:00 -0500 |
en en |
AD 2008/03/07 01:22:34 AD 2007/10/11 05:00:00 |
E | 曜日 | y/M/d H:m:s (E) | 2007/10/11 02:03:04 (Thursday) 2007/10/12 02:03:04 (Fri) 2007/10/13 02:03:04 (土曜日) |
en en ja |
AD 2007/10/11 02:03:04 (Thu) AD 2007/10/12 02:03:04 (Fri) AD 2007/10/13 02:03:04 (Sat) |
年のフォーマット指定に yyy(yyyy でも可)を指定した場合、入力された年は入力された通りに解釈されます。09 と入力しても 2009 にはならず、西暦 9 年と解釈されます。
年のフォーマット指定に y(yy でも可)と指定した場合、さらに、それに対応して2桁の年の値が与えられた場合、その値は過去の80年から未来の20年の間の年として認識されます。例えば 2009 年の時点でパースする場合、29 より大きな値は 19XX 年と解釈されます。また、29 以下の値は 20XX 年と解釈されます。
年の値が 2 桁で与えられた場合に限ってこの「世紀」を補う処理が行なわれる点にも注意してください。フォーマット指定が yy となっていても、それに対応する年の値が 2 桁以外の場合(例えば 2009 とか 123 とか 9 とかの場合)には「世紀」を補う処理は行なわれず、与えられた年の値がそのままパース結果となります。
月のフォーマット指定に MMM を指定した場合、入力には月の名前が与えられなければなりません。月の名前は言語の指定に依存します。例えば言語に "en" (英語)を指定した場合、月の名前は Jan Feb Mar Apr May Jun Jul Aug Sep Dec Nov Dec になります。フルスペルの月の名前 January February March April May Jun July August September October November December も使うことができます。
よく使われる言語について、どのような月の名前、およびその省略名が指定可能かを下表に示します。この表に掲載されていない言語についても、月の名前を使うことは可能です。どの言語でどのような名前が指定可能かは、formatDate() 関数を使って目的の言語の月の名前を表示してみることで知ることができるでしょう。
言語 | ISO 639 言語コード | 月 | 月名の省略形 | フルスペルの月名 |
---|---|---|---|---|
日本語 | ja |
1 2 3 4 5 6 7 8 9 10 11 12 |
1 2 3 4 5 6 7 8 9 10 11 12 |
1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 |
ロシア語 | ru |
1 2 3 4 5 6 7 8 9 10 11 12 |
янв фев мар апр май июн июл авг сен окт ноя дек |
Январь Февраль Март Апрель Май Июнь Июль Август Сентябрь Октябрь Ноябрь Декабрь |
ドイツ語 | de |
1 2 3 4 5 6 7 8 9 10 11 12 |
Jan Feb Mrz Apr Mai Jun Jul Aug Sep Okt Nov Dez |
Januar Februar März April Mai Juni Juli August September Oktober November Dezember |
英語 | en |
1 2 3 4 5 6 7 8 9 10 11 12 |
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec |
January February March April May June July August September October November December |
中国語 | zh |
1 2 3 4 5 6 7 8 9 10 11 12 |
一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月 |
一月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月 |
イタリア語 | it |
1 2 3 4 5 6 7 8 9 10 11 12 |
gen feb mar apr mag giu lug ago set ott nov dic |
gennaio febbraio marzo aprile maggio giugno luglio agosto settembre ottobre novembre dicembre |
フランス語 | fr |
1 2 3 4 5 6 7 8 9 10 11 12 |
janv. févr. mars avr. mai juin juil. août sept. oct. nov. déc. |
janvier février mars avril mai juin juillet août septembre octobre novembre décembre |
タイ語 | th |
1 2 3 4 5 6 7 8 9 10 11 12 |
ม.ค. ก.พ. มี.ค. เม.ย. พ.ค. มิ.ย. ก.ค. ส.ค. ก.ย. ต.ค. พ.ย. ธ.ค. |
มกราคม กุมภาพันธ์ มีนาคม เมษายน พฤษภาคม มิถุนายน กรกฎาคม สิงหาคม กันยายน ตุลาคม พฤศจิกายน ธันวาคม |
スペイン語 | es |
1 2 3 4 5 6 7 8 9 10 11 12 |
ene feb mar abr may jun jul ago sep oct nov dic |
enero febrero marzo abril mayo junio julio agosto septiembre octubre noviembre diciembre |
時刻表現中のタイムゾーン情報は z でパースします。時刻表現中にタイムゾーンが含まれている場合、その時刻表現はそのタイムゾーンにおける時刻表現と見なされます。例えば、タイムゾーンとして JST が含まれている場合、その時刻表現は日本標準時であるとみなされます。つまり、その時刻表現は世界標準時に対して 9 時間先行した(世界標準時に 9 時間加えた)表現となっているものとしてパースされます。
z でパースすればタイムゾーン名の長形式と省略形式のいずれもパースすることができます。パースできるタイムゾーン名の表現は言語の指定で決まります。言語に ja を指定した場合には「日本標準時」といった日本語のタイムゾーン名が使えます。言語が ja である場合「Japan Standard Time」などの英語のタイムゾーン名は使えないことに注意してください。各言語でどのようなタイムゾーン名が使用できるかは formatDate() 関数で目的の言語でタイムゾーン名を表示してみることで調べることができます。日本語および英語のタイムゾーン名については formatDate() 関数の説明の中に一覧がありますので、そちらを参照してください。
曜日の表現は E でパースします。E でパースすれば曜日名の長形式と省略形式のいずれもパースすることができます。パースできる曜日の表現は言語の指定で決まります。言語に ja を指定した場合には「日月火水木金土」といった日本語の曜日名が使えますが Mon や Tue などの英語の曜日名は使えません。各言語でどのような曜日名が使用できるかは formatDate() 関数で目的の言語で曜日を表示してみることで調べることができるでしょう。
日付表現中の年月日の表現と曜日の表現が合致しない場合、曜日のパース結果は無視される点に注意してください。例えば、2008/11/7 (月) という日付表現は誤りです。実際は 2008/11/7 は月曜日ではなく金曜日だからです。parseDate() 関数でこのような日付をパースすると曜日指定の部分は無視されますがエラーにはなりません。例えば、この場合は 2008/11/07 (金) としてパースされます。
時刻表現中にタイムゾーン情報が含まれていない場合、与えられた時刻表現をどのタイムゾーンの時刻表現として扱うかを指定するためにこのパラメタを使用します。タイムゾーンの指定方法は formatDate() 関数の場合と同じです。指定方法については formatDate() 関数の説明を参照してください。
この引数は省略可能です。省略した場合には、サイトに指定されているタイムゾーンを使用してパースが行われます。
時刻表現がどの言語で行なわれているかを指定します。例えば、日本語 "ja" を指定すれば曜日の表現として「日曜日」というように、日本語による表現形式をパースできるようになります。また、英語 "en" を指定すれば「Sunday」や「Sun」という英語の形式をパースできるようになります。
この引数には ISO 639 (JIS X 0412 とほぼ同等) に定義されている 2 文字構成の言語コードを指定することができます。コードの詳細につきましては ISO 639 を参照してください。
この引数は省略可能です。省略した場合には、サーバのデフォルト言語(多くの場合は日本語でしょう)が指定されたものとしてパースが行われます。
テンプレートに「年」「月」「日」という3つの1行テキストの要素が定義されているとします。その3つのフィールドにユーザが入力した年、月、日の値をパースして日付表現にして表示してみます。
<body>
......
%formatDate(parseDate(concatenate(年, "/", 月, "/", 日), "y/MMM/d"), "yyyy/MM/dd (E)")%
......
</body>
結果は、例えば "2009/12/24 (木)" になります。(E) を指定しているので曜日も表示されています。
入力された3つのフィールドの値を concatenate() 関数で連接して日付形式に仕立て上げてから parseDate() 関数で処理しています。
月のフォーマット指定には "MMM" が指定されているので月の欄には「12月」という長形式も入力できます。言語は指定していないので、月の名前は、サーバのデフォルト言語で使われる月の名前でなければなりません。(日本語の場合は「12月」の 12 はいわゆる半角で与える必要があります)
"2008/1/2 13:45" という日付表現をパースして、それを RFC2822 形式で表示してみます。
<body>
......
%formatDateRFC2822(parseDate("2008/1/2 13:45", "y/M/d h:m"), "GMT")%
......
</body>
結果は "Wed, 02 Jan 2008 04:45:00 +0000" になります。
formatDateRFC2822() 関数にパラメタとして "GMT" を指定しているので、表示される RFC2822 形式の日付表現のタイムゾーンは GMT (+0000) になっています。parseDate() 関数には特にタイムゾーンを指定していないので、サーバのデフォルトタイムゾーンを使ってパースされています。この場合、"2008/1/2 13:45" は JST であるものとしてパースされています。結果として9時間の時差が生じています。(JST の 13:45 は GMT の 4:45 と同時刻です)
"2008/6/2 13:45 PDT" という日付表現をパースして、それを W3CDTF 形式で表示してみます。
<body>
......
%formatDateW3CDTF(parseDate("2008/6/2 13:45 PDT", "y/M/d h:m z"), "GMT")%
......
</body>
結果は "2008-06-02T20:45:00+00:00" となります。
parseDate() 関数に与えられた日付表現には "PDT" というタイムゾーン情報が含まれているので「太平洋夏時間」としてパースされています。formatDateW3CDTF() 関数には "GMT" が指定されているので、夏時間時差の 7 時間が加味された結果が表示されています。
2007/02/29 13:20:35 JST を parseDate() 関数を使って数値表現に変換してみます。parseDate() 関数は、渡された引数の日付表現が、指定されているフォーマット指定に従っていない場合には null を返します。
<body>
......
<wr-if condition="isNull(parseDate(\"2008/3/4 12:34\", \"y/M/d H:m:s\"))">
日付表現に誤りがあります。(1)
</wr-if>
......
<wr-if condition="isNull(parseDate(\"2008/3/4 12:34:56\", \"y/M/d H:m\"))">
日付表現に誤りがあります。(2)
</wr-if>
......
<wr-if condition="isNull(parseDate(\"[2008/3/4 12:34:56]\", \"[y/M/d H:m]\"))">
日付表現に誤りがあります。(3)
</wr-if>
......
</body>
(1) はパースエラーとなり null が返されます。フォーマット指定は「秒」を要求していますが、与えられた日付表現には「秒」の部分がないためです。
(2) はエラーにはなりません。フォーマット指定は「秒」を要求していませんが、与えられた日付表現には「秒」部分が存在しています。parseDate() 関数は、与えられた日付表現の末尾部分に使われない文字列があってもエラーと判断しません。
(3) はエラーとなります。フォーマット指定は「分」の終わりに "]" を要求していますが、与えられた日付表現には「秒」部分があり「分」の次が "]" になっていないためです。
parseDate() 関数で日付表現を処理する前に、replaceAll() 関数などで空白文字や記号を整えると便利です。