アプリケーションがブローカーにメッセージを送信するときのそのメッセージ・データの解釈の仕方は、メッセージ内容そのものと、メッセージ・フローの構成によって異なります。XML 物理形式で調整された汎用 XML パーサーまたは MRM パーサーのいずれかによって解釈されるメッセージをアプリケーションが送信する場合、アプリケーションは、XML スキーマ・プリミティブ日時データ・タイプによって表現される日付または時刻のデータを組み込むことができます。
データの各部分の XML スキーマ・データ・タイプは ESQL データ・タイプに変換され、論理メッセージ・ツリーに作成されるエレメントは変換されたタイプとなります。 入力メッセージ内の日時データが選択されたスキーマ・データ・タイプの規則と一致しない場合、メッセージが MRM ドメインにあり、入力メッセージに対して妥当性検査されるようにメッセージ・フローを構成したとしても、パーサーが論理メッセージ・ツリーに書き込む値は変更されます。(妥当性検査は汎用 XML メッセージでは使用できません。)
これは、入力日時データのサブフィールドに対して次のような影響を与えます。
次の例はこれらの点を説明しています。
入力データ XML スキーマ・データ・タイプ | スキーマ規則 | ビット・ストリームの入力値 | 論理ツリーに書き込まれる値 (ブラケットの ESQL データ・タイプ) |
---|---|---|---|
xsd:dateTime | CCYY-MM-DDThh:mm:ss | 2002-12-31T23:59:59 | 2002-12-31 23:59:59 (TIMESTAMP) |
--24 | 1970-01-24 (DATE) | ||
23:59:59 | 23:59:59 (TIME) | ||
xsd:date | CCYY-MM-DD | 2002-12-31 | 2002-12-31 (DATE) |
2002-12-31T23:59:59 | 2002-12-31 (DATE) | ||
-06-24 | 1970-06-24 (DATE) | ||
xsd:time | hh:mm:ss | 14:15:16 | 14:15:16 (TIME) |
xsd:gDay | ---DD | ---24 | 1970-01-24 (DATE) |
xsd:gMonth | --MM | --12 | 1970-12-01 (DATE) |
xsd:gMonthDay | --MM-DD | --12-31 | 1970-12-31 (DATE) |
xsd:gYear | CCYY | 2002 | 2002-01-01 (DATE) |
xsd:gYearMonth | CCYY-MM | 2002-12 | 2002-12-01 (DATE) |
使用するスキーマ日時データ・タイプを検討するときは、メッセージが MRM ドメイン内にありメッセージを妥当性検査するようメッセージ・フローを構成する場合に欠落サブフィールドによって妥当性検査例外が発生する可能性があることを考慮してください。
スキーマ・データ・タイプ Gday、gMonth、gMonthDay、gYear、および gYearMonth は、特定の反復期間の記録に使用されます。妥当性検査がオンになっていると混乱が生じる可能性があります。なぜなら、これらのスキーマ・データ・タイプの中で使用される反復期間は、ESQL によって、時刻の特定のポイントとして保管されるからです。
例えば、その月の 24 日 (これは gDay (月々の日付) タイプ) が論理ツリーに書き込まれる際、欠落する月と年のサブフィールドがエポック (1970 年 1 月) から提供され、特定の日付 1970-01-24 が出されます。10 日のインターバルを追加するなどしてこの日付を扱うよう ESQL をコーディングし、妥当性検査される出力メッセージを生成する場合、例外が出されます。これは、計算結果が、日付の月サブフィールドがエポックの日付と一致しないために無効となっている 1970-02-03 であるためです。
MRM 内では、日時の論理タイプを持つエレメントを定義することができます。
日時エレメントが構文解析される場合、CURRENT_TIME または CURRENT_TIMESTAMP の ESQL データ型を持つメッセージ・ツリー内にフィールドが作成されます。 しかし、CURRENT_TIME および CURRENT_TIMESTAMP のデータ型には時間帯情報を保管する機能がないため、MRM は入力された時間帯やブローカーの時間帯に従って時間を調整することはありません。
CURRENT_TIME および CURRENT_TIMESTAMP のデータ型は時間帯情報を保管できませんが、MRM はこの情報を基本フィールドの一部として保管します。 これは、フィールドがメッセージ・ツリー間でコピーされると時間帯情報がともにコピーされて、この情報を出力時に保存できるようになることを意味します。
フィールドが同じ名前のフィールドにコピーされる場合のみ、この情報が保存されることに注意してください。
ただし、新規フィールドが元フィールドから派生させられる場合は、新規フィールドには時間帯情報がありません。 これは、そのようなフィールドが文字としてキャストされる場合、新規フィールドはブローカーの時間帯を想定しますが、その値は、入力時間帯とブローカーの時間帯の間に差があっても調整されないことを意味します。
例えば、2009-02-20T06:08:07-08:00 を含んでいる入力時間帯エレメントは、入力メッセージ・ツリーから出力メッセージ・ツリーにコピーされて、出力メッセージ内に全く同じフォーマットで表示されている可能性があります。 しかし、エレメントが文字としてキャストされる場合は、GMT を実行しているブローカーによりフォーマット IU が使用されて、結果は 2009-02-20T06:08:07.000Z になります。