將 dateTimes 格式化並剖析為字串

本節提供如何使用型樣字母字串來指定 dateTime 格式的相關資訊。

當您將日期或時間轉換為字串時,必須套用格式型樣來指示轉換。 套用格式型樣以將日期或時間轉換為字串,或將字串剖析為日期或時間。

在轉換期間 (例如,將 dateTime 轉換為字串) ,會將型樣或記號集取代為對等的來源。 下圖顯示如何使用型樣來格式化 dateTime 來源以產生字串輸出。

此圖顯示從 dateTime 來源及格式型樣產生的輸出字串。

剖析字串時 (例如,將字串轉換為 dateTime時) ,會使用型樣或記號集來決定目標 dateTime 的哪一部分由字串的哪一部分代表。 下圖顯示如何完成此作業。

此圖顯示從字串資料來源及格式型樣產生的 dateTime 輸出。

語法

表示式型樣由下列定義:

讀取語法圖跳過視覺化語法圖symbolstring
其中:
符號
是集 adDeEFGhHIkKmMsSTUwWyYzZ中的字元。
字串
是以單引號括住的一連串字元。 如果字串內需要單引號,請使用兩個單引號 (")。

將 dateTime 格式化為字串的字元

下表列出您可以在型樣中用於格式化或剖析與 dateTime相關的字串的字元。 表格後面接著一些附註,以進一步說明表格中的部分範例。

符號 意義 簡報 範例
a AM 或 PM 標記 Text 輸入 am、AM、pm、PM。 輸出 AM 或 PM
d 月內日 (1-31) 號碼 1, 20
dd 每月第幾天 (01-31) 號碼 01, 31
D 一年中的第天 (1-366) 號碼 3, 80, 100
DD 一年中的第幾天 (01-366) 號碼 03, 80, 366
DDD 年 (001-366) 號碼 003
e 星期幾 (1-7)1 號碼 2
EEE 星期幾1 Text 星期二
EEEE 星期幾1 Text 星期二
F 月中的星期幾 (1-5)2 號碼 2
G 紀元 Text BC 或 AD
h AM 或 PM (1-12) 制的小時 號碼 6
hh 上午或下午小時 (01-12) 號碼 06
H 24 小時制 (0-23)3 號碼 7
HH 24 小時制 (00-23)3 號碼 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 ,則輸出為 "Z" 的 ZZZ)4 Text 2006-10-07T12:06:56.568+01:00, 2003-12 -15T15:42:12.000Z
k 24 小時制 (1-24)3 號碼 8
kk 24 小時制 (01-24)3 號碼 08
K 上午或下午小時 (0-11) 號碼 9
KK 上午或下午小時 (00-11) 號碼 09
m 分鐘 號碼 4
公釐 分鐘 號碼 04
M 數值月 號碼 5, 12
MM 數值月 號碼 05, 12
MMM 具名月份 Text 1 月, 2 月
MMMM 具名月份 Text 1 月, 2 月
s 10 號碼 5
ss 10 號碼 05
S decisecond5 號碼 7
不銹鋼 centisecond5 號碼 (70)
SSS 毫秒5 號碼 700
SSSS 0.0001 秒5 號碼 7000
SSSSS 0.00001 秒5 號碼 70000
SSSSSS 0.000001 秒5 號碼 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 號碼 7, 53
世界 一年中的第6 號碼 07, 53
W 7 號碼 2
yy 8 號碼 06
yyyy 8 號碼 2006
YY year: 僅與 week in year 搭配使用6 號碼 06
YYYY year: 僅與 week in year 搭配使用6 號碼 2006
zzz 時區 (縮寫名稱)9 Text EST
zzzz 時區 (完整名稱) Text 美東標準時間
Z 時區 (+/-n) Text +3
TW 時區 (+/-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
ZZZZ 時區 (以 ZZZ 表示,但無冒號) (+/-nnnn) Text +0300
' 跳出文字   '使用者文字'
" (兩個單引號) 跳出文字內的單引號   'o' 時鐘 '

dateTime 物件的呈現取決於您指定的符號。

  • 文字。 如果您指定四個以上符號,則會呈現完整形式。 如果您指定少於四個符號,則會呈現簡短或縮寫形式 (如果存在的話)。 例如, EEEE 會產生 MondayEEE 會產生 Mon
  • 數字。 數值 dateTime 元件的字元數必須在對應格式化符號的範圍內。 重複符號以指定所需的位數下限。 容許的位數上限是特定符號的上限。 例如, day in month 的上限為 31; 因此, d 的格式字串容許剖析值 2 或 21 ,但不容許值 32 和 210。 在輸出上,數字會以零填補指定的長度。 年份是特殊情況; 請參閱下列清單中的附註 8。 小數秒也是特殊大小寫; 請參閱下列清單中的附註 5。
  • 型樣中任何不在 ['a '..' z '] 和 ['A' .. ' 範圍內的字元Z '] 視為引號內的文字。 例如,冒號 (:)、逗點 (,)、句點 (.)、# 記號 (雜湊或井號, #)、at 符號 (@) 及空格等字元會出現在產生的時間文字中,即使它們未以單引號括住也一樣。
  • 您可以建立產生無法預期結果的格式化字串; 因此,您必須小心使用這些符號。 例如,如果您指定 dMyyyy,則無法區分日、月和年。 dMyyyy 告訴整合節點,最少一個字元代表日,最少一個字元代表月,而最少四個字元代表年。 因此, 3111999 可以解譯為 3/11/1999 或 31/1/1999。
附註: 下列附註適用於上表。
  1. 您可以在 day in week 欄位中指定下列值:
    • 1-星期日
    • 2-星期一
    • 3-星期二
    • 4-星期三
    • 5-星期四
    • 6-星期五
    • 7-星期六
  2. 12th 是 7 月的第二個星期三,可以表示為 2006 July Wednesday 2 使用格式字串 yyyy MMMM EEEE F。 請注意,此格式不代表 2006 年 7 月第 2 週 (即 5th ) 的星期三; 此格式字串為 yyyy MMMM EEEE W
  3. 如果指定了衝突的 am/pm 欄位,則 24 小時欄位可能會導致時間不明確。
  4. 請參閱 ISO8601、I 和 T DateTime 記號
  5. 分數秒以大寫 S 表示。 長度必須隱含地符合輸入上的格式符號數目。 例如,格式字串 ss SSSss.SSS代表秒和毫秒。 不過,格式字串 ss.sss 代表重複的欄位 (以秒為單位); 句點 (.) 之後的值會視為秒欄位,而不是小數秒。 輸出會截斷至指定的長度。
  6. 在 ESQL 中,年份的第一天假設為第一週; 因此, 1 月 1 日一律為第 1 週。 因此,相對於一年指定的日期可能在不同的年份中。 例如,使用 "EEEE' week 'w' 'YYYY" 剖析的 "星期一第 1 週 2005" 會提供 2004-12-27 的日期,因為 2005 年第一週的星期一是 2004 年的日期。

    如果您使用 y 符號,則不會進行調整,而且年底前後的日期可能會發生無法預期的結果。 例如,如果字串 "2005 01 星期一" 已格式化:

    • 使用格式字串 "YYYY ww EEEE" 的 2005 年第 1 週星期一正確解譯為 27th 2004 年 12 月
    • 使用格式字串 "yyyy ww EEEE" 的 2005 年第 1 週星期一不正確地解譯為 27th 2005 年 12 月
  7. 一個月中的第一個和最後一個星期可能包括來自相鄰月份的天數。 例如, 2006 年 7 月 31st 星期一可以表示為 2006 年 8 月第一週的星期一,即 2006 08 1 Monday 使用格式字串 yyyy MM W EEEE
  8. 年份作為特殊案例來處理。
    • 在輸出時,如果 y 的計數為 2,則年份會截斷為 2 位數。 例如,如果 yyyy 產生 1997,則 yy 產生 97
    • 在輸入時,若為 2 位數年份, 世紀視窗 會固定為 53。 例如,輸入日期 52 會產生年份值 2052 ,而輸入日期 53 則會產生輸出年份 1953 ,而 97 則會產生 1997。
  9. 使用 zzz 選項可能會有不明確的結果。 例如, BST 可以解譯為 Bangladesh Standard TimeBritish Summer Time。 基於相容性原因, IBM® App Connect Enterprise 會使用先前的解譯。

    若要避免這些問題,請使用具有明確定義名稱的 zzzz 選項; 例如, Europe/London、Asia/Dhaka 或 America/Los_Angeles。

  10. Seconds s & ss, must be in the range 0-59. 如果您需要建構代表閏秒期間的時間的 TIMESTAMP ,其中所建立或強制轉型的值會使用值 60 (代表秒) ,則必須在 ESQL 程式碼內處理此情況。 產品內的 CURRENT_ datetime 函數 (例如 CURRENT_TIME) 絕不會產生秒數值超出 0-59 範圍的時間。

ISO8601、I 和 T DateTime 記號

如果您的 dateTime 值符合 ISO8601:2000 「日期和時間的表示法」標準,請考慮使用符合下列 ISO8601 標準子集的格式化符號 I 和 T。

  • W3C 提議的受限設定檔,網址為 http://www.w3.org/TR/NOTE-datetime
  • 已截斷行事曆日期的表示法,如 ISO8601:2000 的 5.2.1.3 小節中所指定
    • 基本格式 (c、e 和 f 小節)
    • 延伸格式 (子區段 a、b 及 d)

僅單獨使用格式化符號 I 和 T:

  • I 格式化符號符合符合受支援子集的任何 dateTime 字串。
  • T 格式化符號符合任何符合僅由時間部分組成之受支援子集的 dateTime 字串。

下表顯示輸出表單與邏輯資料類型的關係。

邏輯模型資料類型 ESQL 資料類型 輸出表單
xsd:dateTime TIMESTAMP 或 GMTTIMESTAMP yyyy-MM-dd 'T'HH:mm:ss.SSSZZZ
xsd:date 日期 yyyy-MM-dd
xsd:gYear 間隔 yyyy
xsd:gYear月 間隔 yyyy-MM
xsd:gMonth 間隔 -- MM
xsd:gmonthDay 間隔 -- MM-dd
xsd:gDay 間隔 -dd
xsd:time TIME/GMTTIME ' T'HH:mm:ss.SSSZZZ
附註:
  • 在輸入上, I 和 T 都接受 '+ 00:00' 和 'Z' ,以指出與「世界標準時間 (UTC)」之間的零時差,但在輸出上,它們一律會產生 '+ 00:00'。 如果您想要一律在輸出上產生 'Z' ,請改用 IU 或 TU 格式化符號。
  • ZZZ 一律會寫入 '+ 00:00' ,以指出與「世界標準時間 (UTC)」之間的零時差。 如果您想要一律在輸出時產生 'Z' ,請改用 ZZZZu。

在輸出上使用輸入 UTC 格式

邏輯類型 xsd:dateTime 或 xsd: time (以字串形式包含 dateTime ) 的元素或屬性可以使用 Z 符號或時區 + 00:00 來指定「世界標準時間 (UTC)」。 在輸入時, MRM 剖析器會記住這類元素和屬性的 UTC 格式。 在輸出上,您可以使用元素或屬性的 Default DateTime Format 內容指定是否顯示 Z 或 + 00:00。 或者,您可以選取訊息集內容 在輸出上使用輸入 UTC 格式來保留輸入 UTC 格式。 如果選取此內容,則會在輸出訊息中保留 UTC 格式,並置換 dateTime 格式內容所隱含的格式。

瞭解日光節約時間及 CAST 函數

當整合節點在 GMT 以外的時區中執行時,它會根據 CAST 函數提供給它的時間來計算日光節約時間 (DST) 偏移。 為了讓 CAST 正確計算偏移,傳入 CAST 的時間必須有一個相關聯的時區,作為 Z 參數。 如果沒有時區與所傳遞的值相關聯,則時間會轉換為 GMT 時間; 不會將它視為當地時間戳記。

此外,當您使用 CAST 將字串強制轉型為時間值時,會使用現行系統日期來計算 DST 偏移。 若要將字串強制轉型為時間變數並計算特定日期的 DST ,您還必須指定日期。

例如,如果 timeValue= '10:00:00' ,則下列程式碼在中部日光節約時區的整合節點上執行,將時間轉換為 GMT ,因為未指定時區 ID:
DECLARE castTime TIME;
SET castTime = CAST (timeValue AS TIME FORMAT timePattern)
如果在任何後續程式碼中使用 castTime 變數,則時間不會再次轉換為 GMT ,例如
CAST(castDate, castTime AS GMTTIMESTAMP);

範例

下表顯示一些 dateTime 格式的範例。

格式型樣 結果
"yyyy.MM.dd 'at' HH:mm:ss ZZZ " 2006.07.10 at 15: 0 8: 56 -05:00
"EEE , MMM d ," yy " 2006 年 7 月 10 日
"h:mm a" 晚上 8:08
"hh o" 時鐘 a , ZZZZ " 上午 09 點, GMT+09:00
"K :mm a , ZZZ" 上午 9:34 , -05:00
"yyyy.MMMMM.dd hh: mm aaa " 1996.July.10 12:08 PM

在 MRM 網域內使用

在 MRM 中,可以定義邏輯類型為 dateTime的元素。

當剖析 dateTime 元素時,會在訊息樹狀結構中建立一個欄位,其 ESQL 資料類型為 CURRENT_TIME 或 CURRENT_TIMESTAMP。 然而, CURRENT_TIME 和 CURRENT_TIMESTAMP 資料類型沒有儲存時區資訊的功能, MRM 不會根據整合節點的輸入時區和時區來調整時間。

雖然 CURRENT_TIME 和 CURRENT_TIMESTAMP 資料類型無法儲存時區資訊,但 MRM 會將此資訊儲存為基礎欄位的一部分。 這表示如果在訊息樹狀結構之間複製欄位,則會一併複製時區資訊,容許在輸出時保留此資訊。

請注意,只有在欄位複製到同名的欄位時,才會保留資訊。

不過,如果有任何新欄位衍生自原始欄位,則新欄位沒有時區資訊。 這表示如果此類欄位強制轉型為字元,則新欄位會假設整合節點的時區,但不會針對輸入時區與整合節點時區之間的任何差異調整其值。

例如,包含 2009-02-20T06:08:07-08:00 的輸入 dateTime 元素可以從輸入訊息樹狀結構複製到輸出訊息樹狀結構,並以完全相同的格式出現在輸出訊息中。 不過,如果執行 GMT 的整合節點將元素強制轉型為字元 (使用格式 IU) ,則結果會是 2009-02-20T06:08:07.000Z