日時をストリングとしてフォーマット設定および構文解析する

以下に、パターン文字のストリングを使用して dateTime 形式を指定する方法に関する情報を記載します。

日付または時刻をストリングに変換するとき、変換を誘導するための形式のパターンを適用する必要があります。 この形式パターンを適用して、日付または時刻からストリングに変換したり、ストリングを日付または時間に構文解析したりします。

変換 (例えば、日時からストリングへ) の際に、パターンまたはトークンのセットが対応するソースに置き換わります。 以下の図は、パターンを使用して dateTime ソースをフォーマットして文字ストリング出力を生成する方法について示しています。

この図は、dateTime ソースとフォーマット・パターンの結果の出力ストリングを示しています。

ストリングが構文解析されるとき (例えば、 そのストリングを dateTime に変換するときなど)、パターンまたはトークンのセットが使用されて、 ターゲットの dateTime のどの部分がストリングのどの部分によって表現されているのかを判別します。 以下の図は、これを行う方法を示しています。

この図は、ストリング・データ・ソースとフォーマット・パターンの結果の dateTime 出力を示しています。

構文

式のパターンは、以下のように定義されます。

構文図を読むビジュアル構文図をスキップsymbolストリング
説明
symbol
セット adDeEFGhHIkKmMsSTUwWyYzZ 内の文字。
ストリング
単一引用符で囲まれた、一連の文字。 ストリング内に単一引用符が必要な場合には、2 つの単一引用符 (") を使用します。

dateTime をストリングとしてフォーマットするための文字

以下の表は、dateTime に関連してストリングをフォーマットまたは構文解析するためのパターンに使用できる文字をリストしています。 表の後に、表中の例の詳細について説明する注記があります。

記号 意味 表示内容
a AM または PM のマーク文字 Text 入力は、am、AM、pm、PM。 出力は、AM または PM
d 日 (1 から 31) Number 1, 20
dd 日 (01 から 31) Number 01, 31
D 日 (1 から 366) Number 3, 80, 100
DD 日 (01 から 366) Number 03, 80, 366
DDD 日 (001 から 366) Number 003
e 曜日 (1 から 7)1 Number 2
EEE 曜日1 Text Tue
EEEE 曜日1 Text Tuesday
F 月単位の曜日 (1 から 5)2 Number 2
G Era Text BC または AD
h AM または PM の時間 (1 ~ 12) Number 6
hh AM または PM の時間 (01 から 12) Number 06
H 24 時間形式での時刻 (0 から 23)3 Number 7
HH 24 時間形式での時刻 (00 から 23)3 Number 07
I ISO8601 日付/時刻 (yyyy-MM-dd'T'HH:mm:ss まで) SSSZZZ) 4 Text 2006-10-07T12:06:56.568+01:00
IU ISO8601 日時 (I と同様。ただし時間帯が +00:00 であれば ZZZ の出力は "Z")4 Text 2006-10-07T12:06:56.568+01:00, 2003-12 -15T15:42:12.000Z
k 24 時間形式での時刻 (1 から 24)3 Number 8
kk 24 時間形式での時刻 (01 から 24)3 Number 08
K AM または PM の時間 (0 ~ 11) Number 9
KK AM または PM の時間 (00 から 11) Number 09
m Number 4
mm Number 04
M 数字による月 Number 5, 12
MM 数字による月 Number 05, 12
MMM 名前による月 Text Jan、Feb
MMMM 名前による月 Text January、February
s seconds10 Number 5
ss seconds10 Number 05
S decisecond5 Number 7
SS centisecond5 Number 70
SSS millisecond5 Number 700
SSSS 0.0001 秒5 Number 7000
SSSSS 0.00001 秒5 Number 70000
SSSSSS 0.000001 秒5 Number 700000
T ISO8601 時間 (最大 HH:mm:ss.SSSZZZ)4 Text 12:06:56.568+01:00
TU ISO8601 時間 (T と同様。ただし、時間帯の +00:00 は 'Z' に置き換わる)4 Text 12:06:56.568+01:00, 15:42:12.000Z
w 週 (年単位)6 Number 7, 53
ww 週 (年単位)6 Number 07, 53
W 週 (月単位)7 Number 2
yy year8 Number 06
yyyy year8 Number 2006
YY 年: 週と共に使用する場合のみ6 Number 06
YYYY 年: 週と共に使用する場合のみ6 Number 2006
zzz 時間帯 (省略名)9 Text EST
zzzz 時間帯 (完全名) Text 東部標準時
Z 時間帯 (+/-n) Text +3
ZZ 時間帯 (+/-nn) Text +03
ZZZ 時間帯 (+/-nn:nn) Text +03:00
ZZZU 時間帯 (ZZZ と同様。"+00:00" は "Z" に置き換わる) Text +03:00, Z
ZZZZ 時間帯 (GMT+/-nn:nn) Text GMT+03:00
ZZZZZ 時間帯 (ZZZ と同様。ただしコロンはない) (+/-nnnn) Text +0300
' テキストのエスケープ   'ユーザー・テキスト'
" (2 個の単一引用符) エスケープされたテキスト内の単一引用符   'o"clock'

dateTime オブジェクトの表示は、指定するシンボルによって異なります。

  • テキスト. 4 つ以上のシンボルを指定した場合は、完全形式が表示されます。 4 つ未満のシンボルを指定した場合は、 短形式または省略形式があれば表示されます。 以下に例を示します。EEEE生成Monday,EEE生成Mon.
  • 数値. 数値 dateTime コンポーネントの文字数は、対応するフォーマット・シンボルの範囲内でなければなりません。 必要な最小桁数を指定するには、シンボルを複数繰り返します。 許容される最大桁数は、特定のシンボルの上限です。 以下に例を示します。day in monthの上限は 31 です。したがって、次の書式制御ストリングは、d値 2 または 21 を構文解析できますが、値 32 および 210 は許可されません。 出力時には、指定された長さになるまで数値にゼロが埋め込まれます。 年は特殊ケースになります。次のリストの注 8 を参照してください。 秒の端数も特殊ケースになります。次のリストの注 5 を参照してください。
  • ['a'..'z'] および ['A'..'Z'] の範囲外のパターンの文字は、引用符付きテキストとして扱われます。 例えば、コロン (:)、コンマ (,)、ピリオド (.)、番号記号 (ハッシュやポンド記号、#)、アットマーク (@)、スペースなどの文字は、単一引用符で囲まなくても、作成結果の時間テキストに表示されます。
  • 予測不能な結果を生み出す書式制御ストリングを作成することがあります。そのため、これらのシンボルは注意深く使用する必要があります。 例えば、次のように指定したとします。dMyyyy日、月、年を区別することはできません。dMyyyy少なくとも 1 文字が日を表し、最小 1 文字が月を表し、4 文字が年を表すことを統合ノードに通知します。 そのため、以下の点を考慮してください。31119993/11/1999 または 31/1/1999 として解釈できます。
注: 以下の注記は、上記の表に適用されます。
  1. 以下の値を指定できます。day in weekフィールド:
    • 1 - 日曜日
    • 2 - 月曜日
    • 3 - 火曜日
    • 4 - 水曜日
    • 5 - 木曜日
    • 6 - 金曜日
    • 7 - 土曜日
  2. 12th 2006 年 7 月は 7 月の第 2 水曜日であり、次のように表すことができます。2006 July Wednesday 2書式制御ストリングの使用yyyy MMMM EEEE Fこの形式は、2006 年 7 月 2 日の水曜日 ( 5th July 2006) を表していないことに注意してください。この形式の書式制御ストリングは、以下のとおりです。yyyy MMMM EEEE W.
  3. 24 時間フィールドが競合する am/pm フィールドとともに指定される場合、結果があいまいになる場合があります。
  4. ISO8601、I および T DateTime トークンを参照してください。
  5. 秒の端数は大文字 S によって表されます。 長さは、入力時のフォーマット記号の数と暗黙的に一致する必要があります。 書式制御ストリングss SSSORss.SSS例えば、秒とミリ秒を表します。 ただし、書式制御ストリングは、ss.sss(秒の) 繰り返しフィールドを表します。ピリオド (.) の後の値は、小数秒ではなく、秒フィールドと見なされます。 出力は指定された長さに切り捨てられます。
  6. ESQL では、1 年の最初の日は最初の週に属するものと想定します。ですから、1 月 1 日は必ず第 1 週に含まれます。 結果として、1 つの年の中で相対的に指定される日付が、別の年の日付である可能性もあります。 例えば、「Monday week 1 2005」は、以下を使用して解析されます。EEEE' week 'w' 'YYYY「 2005 年の最初の週の月曜日は 2004 年の日付であるため、日付は 2004-12-27 になります。

    以下を使用するとします。y記号の場合、調整は行われず、年末前後の日付については予測できない結果が生じる可能性があります。 例えば、ストリング「2005 01 Monday」が以下のように形式設定される場合、

    • 書式制御ストリング " を使用した 2005 年第 1 週の月曜日YYYY ww EEEE「 27th December 2004 と正しく解釈されます。
    • 書式制御ストリング " を使用した 2005 年第 1 週の月曜日yyyy ww EEEE「 誤って 27th 2005 年 12 月と解釈される
  7. 月の第 1 週と最終週に、前後の月の日が含まれることがあります。 例えば、2006 年 7 月の月曜日 31st は、以下のように 2006 年 8 月 1 日 (月)として表すことができます。2006 08 1 Monday書式制御ストリングの使用yyyy MM W EEEE.
  8. 年は特殊ケースとして扱われます。
    • 出力時に、以下のカウントがy2年は 2 桁に切り捨てられます。 例えば、yyyy生成1997,yy生成97.
    • 入力時には、2 桁の年のために世紀ウィンドウが 53 に固定されます。 例えば、入力された日付が 52 のとき年の値は 2052 になり、入力された日付が 53 では出力の年の値は 1953に、97 では 1997 になります。
  9. 使用zzzあいまいな結果になることがあります。 以下に例を示します。BST次のように解釈できます。Bangladesh Standard TimeORBritish Summer Time互換性の理由から、 IBM® Integration Bus は以前の解釈を使用します。

    これらの問題を回避するには、zzzz明確に定義された名前を持つオプション。例えば、Europe/London、Asia/Dhaka、または America/Los_Angeles など。

  10. s &ssは、0 から 59 の範囲でなければなりません。 うるう秒の時間を表す TIMESTAMP を構成する必要があるとき (この場合、作成またはキャストされる値では秒に値 60 が使用されます)、このケースを ESQL コード内で処理する必要があります。 製品内で CURRENT_ datetime 関数 (例えば、CURRENT_TIME) を使用しても、秒の値が 0 から 59 の範囲外になる時刻は生成されません。

ISO8601、I および T 日時トークン

日時値が ISO8601:2000「日時の表記」規格に準拠している場合は、フォーマット・シンボル I および T を使用することを考慮してください。これらは、ISO8601 規格の以下のサブセットと一致します。

  • W3C によって提案された制限付きプロファイル ( http://www.w3.org/TR/NOTE-datetime )
  • ISO8601:2000 のセクション 5.2.1.3 で指定されている暦日付の省略表記
    • 基本フォーマット (サブセクション c、e、および f)
    • 拡張フォーマット (サブセクション a、b、および d)

フォーマット・シンボル I および T は、単独で使用してください。

  • I フォーマット・シンボルは、サポートされるサブセットに準拠する任意の日時ストリングと一致します。
  • T フォーマット・シンボルは、時刻部分のみで構成されるサポートされるサブセットに準拠する任意の日時ストリングと一致します。

以下の表は、出力形式と論理データ・タイプの関連性を示しています。

論理モデル・データ・タイプ ESQL データ・タイプ (ESQL data type) 出力形式
xsd:dateTime TIMESTAMP または GMTTIMESTAMP yyyy-MM-dd'T'HH:mm:ss.SSSZZZ
xsd:date DATE yyyy-MM-dd
xsd:gYear INTERVAL yyyy
xsd:gYearMonth INTERVAL yyyy-MM
xsd:gMonth INTERVAL --MM
xsd:gmonthDay INTERVAL --MM-dd
xsd:gDay INTERVAL ---dd
xsd:time TIME / GMTTIME 'T'HH:mm:ss.SSSZZZ
注:
  • 入力時は I と T の両方で、協定世界時 (UTC) との時差がゼロであることを示す '+00:00' および 'Z' の両方が受け入れられますが、出力時は常にどちらの場合も '+00:00' が生成されます。 出力時に 'Z' を常時生成したい場合には、代わりに IU または TU フォーマット・シンボルを使用してください。
  • ZZZ では、協定世界時 (UTC) との時差がゼロであることを示すために常に '+00:00' が書き込まれます。 出力時に 'Z' を常時生成したい場合には、代わりに ZZZU を使用してください。

出力での入力 UTC 形式の使用

dateTime をストリングとして含む論理タイプ xsd:dateTime または xsd:time のエレメントまたは属性は、Z シンボルまたは時間帯 +00:00 のどちらかを使用することにより、協定世界時 (UTC) を指定できます。 入力の際に、MRM パーサーはそのようなエレメントおよび属性の UTC 形式を記憶します。 出力の際に、エレメントまたは属性の「デフォルトの日時形式」プロパティーを使用することにより、Z または +00:00 を表示するかどうかを指定できます。 またはその代わりに、メッセージ・セット・プロパティー「出力時に入力 UTC 形式を使用」を選択することにより、入力 UTC 形式を保存することもできます。 このプロパティーが選択されている場合には、UTC 形式が出力メッセージに保存され、「日時形式」プロパティーにより暗黙的に示される形式をオーバーライドします。

夏時間調整時刻と CAST 関数について

統合ノードが GMT 以外のタイム・ゾーンで稼働している場合、ブローカーは提供される時刻について、CAST 関数により、夏時間調整時刻 (DST) オフセットを計算します。 CAST がオフセットを正しく計算するためには、CAST に渡される時刻には、Z パラメーターとしてそれに関連付けられたタイム・ゾーンがなければなりません。 渡される値に関連付けられたタイム・ゾーンがない場合、時刻は GMT 時に変換され、ローカルのタイム・スタンプとしては扱われません。

さらに、CAST を使用してストリングを時刻値にキャストするときは、DST オフセットは現行システム日付を使用して計算されます。 ストリングを時刻変数にキャストし、DST を特定の日付用に計算するには、日付も指定する必要があります。

例えば、timeValue='10:00:00' の場合、中央部夏時間ゾーンにある統合ノードで実行される以下のコードは、タイム・ゾーン ID が指定されていないので、時刻を GMT に変換します。
DECLARE castTime TIME;
SET castTime = CAST (timeValue AS TIME FORMAT timePattern)
castTime 変数が、例えば以下のように後続のコードで使用されるとしても、時刻が再度 GMT に変換されることはありません。
CAST(castDate, castTime AS GMTTIMESTAMP);

次の表は、日時形式のいくつかの例を示しています。

形式のパターン 結果
"yyyy.MM.dd 'at' HH:mm:ss ZZZ" 2006.07.10 at 15:08:56 -05:00
"EEE, MMM d, "yy" Wed, July 10, '06
"h:mm a" 8:08 PM
"hh o"clock a, ZZZZ" 09 o'clock AM, GMT+09:00
"K:mm a, ZZZ" 9:34 AM, -05:00
"yyyy.MMMMM.dd hh:mm aaa" 1996.July.10 12:08 PM

MRM ドメイン内での使用

MRM 内では、日時の論理タイプを持つエレメントを定義することができます。

日時エレメントが構文解析される場合、CURRENT_TIME または CURRENT_TIMESTAMP の ESQL データ・タイプを持つメッセージ・ツリー内にフィールドが作成されます。 しかし、CURRENT_TIME および CURRENT_TIMESTAMP のデータ型には時間帯情報を保管する機能がないため、MRM は入力された時間帯や統合ノードの時間帯に従って時間を調整することはありません。

CURRENT_TIME および CURRENT_TIMESTAMP のデータ・タイプは時間帯情報を保管できませんが、MRM はこの情報を基本フィールドの一部として保管します。 これは、フィールドがメッセージ・ツリー間でコピーされると時間帯情報がともにコピーされて、この情報を出力時に保存できるようになることを意味します。

フィールドが同じ名前のフィールドにコピーされる場合のみ、この情報が保存されることに注意してください。

ただし、新規フィールドが元フィールドから派生させられる場合は、新規フィールドには時間帯情報がありません。 これは、そのようなフィールドが文字としてキャストされる場合、新規フィールドは統合ノードの時間帯を想定しますが、その値は、入力時間帯と統合ノードの時間帯の間に差があっても調整されないことを意味します。

例えば、次を含む入力 dateTime 要素があるとします。2009-02-20T06:08:07-08:00入力メッセージ・ツリーから出力メッセージ・ツリーにコピーして、まったく同じ形式で出力メッセージに表示することができます。 ただし、エレメントが文字としてキャストされる場合は、次のフォーマットを使用します。IUGMT を実行する統合ノードにより、結果は次のようになります。2009-02-20T06:08:07.000Z.