日付/時刻マスクとフォーマット指定子

EGL は、DATE、TIME、TIMESTAMP、INTERVAL 変数のコンポーネントを表すのに大文字と小文字によるパターンを使用します。これらの文字には大/小文字の区別があり、パターン内のすべての文字は、日付または時刻のコンポーネントに構文解析されます。これらの文字の使用規則は、これらの文字の使用の仕方により若干異なります。
  • TIMESTAMP または INTERVAL 変数を宣言する場合、変数の内部形式を定義するためにマスク を指定できます。 EGL は、変数の値に準じてマスク情報を移動させます。 (EGL は常に DATE 変数を yyyyMMdd、TIME 変数を HHmmss として保存します)。
  • 値を日付/時刻変数に割り当てるために文字列を使用する場合は、構文解析フォーマット を使用します。
  • 日付/時刻変数の内部値を表示または出力する場合、表示フォーマット を使用します。

これらの変数の内部値について詳しくは、『プリミティブ・データ型』を参照してください。

INTERVAL マスクの作成

月スパン形式のマスクには、以下の文字を、示されているとおりの順に使用できます。
y
間隔の年数を表す 0 桁から 9 桁までの数字。
M
間隔の月数を表す 0 桁から 9 桁までの数字。M がマスク内の最初の文字でない場合、 指定できるのは最大 2 桁までです。

デフォルトのマスクは yyyyMM です。

秒スパン形式のマスクには、以下の文字を、示されているとおりの順に使用できます。
d
間隔の日数を表す 0 桁から 9 桁までの数字。
H
間隔の時間数を表す 0 桁から 9 桁までの数字。H がマスク内の最初の文字でない場合 、指定できるのは最大 2 桁までです。
m
間隔の分数を表す 0 桁から 9 桁までの数字。m がマスク内の最初の文字でない場合、指定できるのは最大 2 桁までです。
s
間隔の秒数を表す 0 桁から 9 桁までの数字。s がマスク内の最初の文字でない場合、指定できるのは最大 2 桁までです。
f
それぞれが秒の小数部を表す 0 から 6 桁の数字。最初の数字は 10 分の 1 を表し、2 番目は 100 分の 1 を表し、以下同様です。 f がマスク内の最初の文字でない場合でも、指定できるのは最大 6 桁までです。
マスクの先頭または末尾で所定の種類の文字を使用しなくてもかまいませんが、中間の文字をスキップすることはできません。 以下のようなマスクが有効です。
  yyyyyyMM
  yyyyyy
  MM

  ddHHmmssffffff
  HHmmssff
  mmss
  HHmm
ただし、以下のマスクは、中間の文字が欠落しているため無効です。
  // 無効
  ddmmssffffff 
  HHssff

TIMESTAMP マスクの作成

マスクを指定するときは、以下の文字を順に使用できます。
yyyy
年を表す 4 桁の数字。範囲は 0000 から 9999 までです。
MM
月を表す 2 桁の数字。範囲は 01 から 12 までです。
dd
日を表す 2 桁の数字。範囲は 01 から 31 までです。
HH
時を表す 2 桁の数字。範囲は 00 から 23 までです。
mm
分を表す 2 桁の数字。範囲は 00 から 59 までです。
ss
秒を表す 2 桁の数字。範囲は 00 から 59 までです。
f
それぞれが秒の小数部を表す 0 から 6 桁の数字。最初の数字は 10 分の 1 を表し、2 番目は 100 分の 1 を表し、以下同様です。

デフォルトのマスクは yyyyMMddHHmmss です。

以下の規則も適用されます (例外については、このトピックの『互換性』を参照してください)。
  • マスクの先頭または末尾で所定の種類の文字を使用しなくてもかまいませんが、中間の文字をスキップすることはできません。
  • 以下のようなマスクが有効です。
      yyyyMMddHHmmss
      yyyy
      MMss
  • 以下のマスクは、中間の文字が欠落しているため無効です。
      // 無効
      ddMMssffffff
      HHssff

表示または構文解析フォーマットの作成

入力文字列をスキャンして「日付/時刻」変数の値を設定する場合、EGL は以下のいずれかの (変数の型に応じた) システム変数の現行値を使用します。
  • strLib.defaultDateFormat
  • strLib.defaultTimeFormat
  • strLib.defaultTimestampFormat

構文解析フォーマットの規則は、表示フォーマットの規則と同じであり、例外については以下の規則として示します。

以下のいずれかのシステム関数を使用して、「日付/時刻」変数を出力用の文字列に変換できます。
  • strLib.formatDate()
  • strLib.formatTime()
  • strLib.formatTimestamp()
以下のいずれかの値を使用して、変換のフォーマットを指定できます。
  • 作成した独自のフォーマット・パターン。
  • EGL が定数として定義している複数の標準パターンのいずれか (「formatDate()」strLib 関数を参照)。
  • 変換する変数の型に応じたデフォルト・フォーマット (strLib.defaultDateFormat など)。

ユーザー独自のフォーマット・パターンは、日付または時刻の構成要素を示す文字を使用して作成します。 日付または時刻のコンポーネントとしてテキストを構文解析することなく、日付/時刻ストリングに文字を組み込むには、その文字 (単数または複数) を単一引用符で囲んでください。 日付、時刻、またはタイム・スタンプで単一引用符を表示する場合は、単一引用符を 2 個使用します。

次の表では、パターン内の文字およびその値をリストしています。

文字 日付または時刻コンポーネント
G 紀元指定子 テキスト AD
y 1996; 96
M 1 年のうちの月 July; Jul; 07
w 1 年のうちの週 数値 27
W 1 カ月のうちの週 数値 2
D 1 年のうちの日 数値 189
d 1 カ月のうちの日 数値 10
F 週の曜日 数値 2
E 週の曜日 テキスト Tuesday; Tue
a AM/PM マーカー テキスト PM
H 1 日のうちの時間 (0 から 23) 数値 0
k 1 日のうちの時間 (0 から 24) 数値 24
K AM/PM での時間 (0 から 11) 数値 0
h AM/PM での時間 (1 から 12) 数値 12
m 1 時間のうちの分数 数値 30
s 1 分のうちの秒数 数値 55
S ミリ秒 (出力) 数値 978
f ミリ秒 (構文解析) 数値 978
z タイム・ゾーン 一般タイム・ゾーン 太平洋標準時; PST; GMT-08:00
Z タイム・ゾーン RFC 822 タイム・ゾーン -800
C 世紀 世紀 20; 21

パターン内で連続して使用される複数の同一文字によって、EGL がストリング内で対応する数字、文字、または両方を解析する方法が決まります。 解釈は、文字のタイプによって異なり、またパターンがフォーマット設定または構文解析のいずれに使用されるかに応じても異なります。次のリスト は、文字の型、およびこれらの文字の数量の違いが、それらの解釈方法にどのように影響するかを示しています。

テキスト
出力設定の場合、文字数が 4 文字より多い場合は、フル書式が使用されます。4 文字以上のときは、可能な場合、略語が使用されます。 構文解析では、パターン文字の数に関係なく、両方の書式が受け入れられます。
数値
出力の場合、パターン文字の数は、最小桁数を表します。 数字を指定の長さに短くする場合は、ゼロが追加されます。 構文解析では、2 つの隣接するフィールドを分離するために必要でないかぎり、パターン文字の数は無視されます。
フォーマット設定の場合、パターン文字の数が 2 であれば、年が 2 桁に切り捨てられます。 その他の場合は、年は数値型として解釈されます。

構文解析では、パターン文字の数が 2 でない場合、桁数に関係なく、年は文字どおりに解釈されます。 例えば、パターン MM/dd/yyyy に値 01/11/12 を割り当てると、January 11, 12 A.D. と解析されます。同じパターンに値 01/02/3 または 01/02/0003 を割り当てると、January 2, 3 A.D. と解析されます。同様に、同じパターンに値 01/02/-3 を割り当てると、January 2, 4 B.C. と解析されます。

構文解析では、パターンが yy の場合、パーサーにより、現在の年を基準としてフル年が判別されます。 パーサーは、2 桁で表された年を、処理時点の 80 年前から 20 年後以内と想定します。例えば、現在の年が 2007 年である場合、 パターン MM/dd/yy に値 01/11/12 を割り当てると 2012 年 1 月 11 日と解析し、 値 05/04/64 を割り当てると 1964 年 5 月 4 日と解析します。

文字パターンの数が 3 以上の場合、月はテキスト型として解釈されます。その他の場合は、年は数値型として解釈されます。
ミリ秒
INTERVAL または TIMESTAMP 変数をフォーマットするには、SSSS を使用します。 (変数を宣言する場合は、代わりに ffff を使用します。) 以下に例を示します。
t TIMESTAMP( "ssffff" );
s STRING = StrLib.formatTimestamp( t, "ssSSSS" );
一般タイム・ゾーン
一般タイム・ゾーンは、名前が付けられている場合、テキスト型として解釈されます。GMT オフセット値を表すタイム・ゾーンの場合、次の構文規則が使用されます。

GMTOffsetTimeZone = GMT 符号 時間

符号
+ または -
時間
0 から 23 までの 1 桁または 2 桁の数値。書式はロケールに依存せず、 ユニコード規格の基本ローマ字ブロックから取得する必要があります。
00 から 59 までの 2 桁の数値。書式はロケールに依存せず、 ユニコード規格の基本ローマ字ブロックから取得する必要があります。

構文解析では、RFC 822 タイム・ゾーンも許容されます。

RFC 822 タイム・ゾーン
フォーマット設定には、RFC 822 4 桁タイム・ゾーン形式が使用されます。

RFC822TimeZone = 符号 TwoDigitHours

TwoDigitHours は、00 から 23 までの 2 桁の数値でなければなりません。 その他の定義は、一般タイム・ゾーンと同じです。

構文解析では、一般タイム・ゾーンも許容されます。

世紀
次の計算結果を表す数値型として表示されます。4 桁の西暦年を 100 で除算し、 余りは無視されます。

次の表では、米国のロケールで解釈される日付と時刻パターンのサンプルの一部を記載しています。すべて同じ日付、4 July、2001、午後 12:08:56、太平洋夏時間 (Pacific Daylight Time) を使用しています。

日付と時刻のパターン 結果
yyyy.MM.dd G 'at' HH:mm:ss z 2001.07.04 AD at 12:08:56 PDT
EEE, MMM d, ''yy Wed, Jul 4, '01
h:mm a 12:08 PM
hh 'o''clock' a, zzzz 12 o'clock PM, Pacific Daylight Time
K:mm a, z 0:08 PM, PDT
yyyyy.MMMMM.dd GGG hh:mm aaa 02001.July.04 AD 12:08 PM
EEE, d MMM yyyy HH:mm:ss Z Wed, 4 Jul 2001 12:08:56 -0700
yyMMddHHmmssZ 010704120856-0700

カレンダー指定子

「日付/時刻」フォーマット指定子には、カレンダー指定子を組み込むこともできます。 これらの指定子は EGL が入力する日付ストリングの構文解析、 または出力する日付ストリングのフォーマットに使用するカレンダー・システムを示します。EGL は、指定したカレンダーや、DATE、TIME、TIMESTAMP 変数の内部値の、ストリング・データ間における変換を実行します。

2 文字のカレンダー指定子は日付パターンの最初に置く必要があり、最初の文字は大文字、2 番目の文字は小文字でなければなりません。 下の表に、使用可能なカレンダーを示します。
表 1. カレンダー
カレンダー指定子 カレンダー
Bu 仏教暦
Ch 中国暦
Gr グレゴリオ暦
He ヘブライ暦
Is イスラム暦
Ja 和暦

各種のカレンダー・システムでローカライズされた日付ストリングは、他のロケールでは出力できない場合があるため、この問題は複雑になりがちです。 カレンダーが異なると、使用する年号指定子のほか、年の番号付けの起点も異なるので、多くの場合、特定のローカライズされた環境でしか正しく表示されません。 例えば、和暦の元号日付システムは、旧形式のユリウス暦 (グレゴリオ暦より数日遅れ) 同様、日本の天皇の治世年により決まります。

次のコード・フラグメントは、グレゴリオ暦から和暦に日付を変換する 1 つの方法を示しています。
myDate DATE;
myJapaneseDate STRING;

strLib.defaultDateFormat = "Gryyyy/MM/dd";
myDate = "1912/08/13";
myJapaneseDate = formatDate(myDate,"JaGyy/MM/dd");
ご使用のシステムが日本向けにローカライズされている場合、strLib.defaultDateFormat を和暦を使用するように設定したり、myDate を和暦の日付に設定したりすることができます。 EGL は日付ストリングをデフォルトの日付形式に準拠して構文解析し、8 桁のグレゴリオ暦の日付として保存します。

以下の表は、グレゴリオ暦の日付を上で示した日本元号形式に変換した例を示しています。 大括弧内の名前は、所定の日本元号を示す日本語の文字 (4 つの 2 バイト) を表します。

表 2.
グレゴリオ暦の日付 日本元号に基づく日付
1868/09/20 [明治]01/09/08
1912/08/12 [明治]45/07/30
1912/08/13 [大正]01/07/31
1927/01/07 [大正]15/12/25
1927/01/08 [昭和]01/12/26
1989/01/20 [昭和]64/01/07
1989/01/21 [平成]01/01/08
2005/01/14 [平成]17/01/01

EGL は、Java™ バージョンの International Components for Unicode ライブラリー (ICU4J) を使用して、入力および表示に必要な日付変換を行っています。 しかし、EGL は、常に日付をグレゴリオ暦形式の 8 桁を使用して保存します。 つまり、タイ語のアプリケーションでは仏教暦の日付が必要になりますが、 EGL では変換に ICU4J を使用することで、その日付を 8 桁のグレゴリオ暦形式で保存しているということです。 アプリケーションは、使用するパターンの整合性を保つため、この処理はプログラマーおよびユーザーの両方に対し非表示のままになっています。

互換性

表 3. 「日付/時刻」フォーマットの互換性に関する考慮事項
プラットフォーム 問題
COBOL 生成
  • TIMESTAMP 形式の場合、指定したすべての構成要素が連続している必要があります。 例えば、月と日は指定することができますが、月と時間は指定できません。
  • ミリ秒 (ffffff) を指定することができますが、システム時刻を受信したときに設定されるのは最初の 2 バイトのみです。ミリ秒単位の残りのバイトは 0 に設定されます。
  • フォーマット・パターン W および w を使用する場合、COBOL は ISO 8601 標準をサポートせず、ISO 8601 結果を提供しません。 これらの結果は、Java 生成およびデバッガーと矛盾する場合があります。
DB2® この表内の『COBOL 生成』の項目を参照してください。
Rich UI Rich UI の日時サポート』を参照してください。