將 dateTimes 格式化並剖析為字串
本節提供如何使用型樣字母字串來指定 dateTime 格式的相關資訊。
當您將日期或時間轉換為字串時,必須套用格式型樣來指示轉換。 套用格式型樣以將日期或時間轉換為字串,或將字串剖析為日期或時間。
在轉換期間 (例如,將 dateTime 轉換為字串) ,會將型樣或記號集取代為對等的來源。 下圖顯示如何使用型樣來格式化 dateTime 來源以產生字串輸出。
剖析字串時 (例如,將字串轉換為 dateTime時) ,會使用型樣或記號集來決定目標 dateTime 的哪一部分由字串的哪一部分代表。 下圖顯示如何完成此作業。
語法
表示式型樣由下列定義:
將 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
會產生Monday
,EEE
會產生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。
- 您可以在
day in week
欄位中指定下列值:- 1-星期日
- 2-星期一
- 3-星期二
- 4-星期三
- 5-星期四
- 6-星期五
- 7-星期六
- 12th 是 7 月的第二個星期三,可以表示為
2006 July Wednesday 2
使用格式字串yyyy MMMM EEEE F
。 請注意,此格式不代表 2006 年 7 月第 2 週 (即 5th ) 的星期三; 此格式字串為yyyy MMMM EEEE W
。 - 如果指定了衝突的 am/pm 欄位,則 24 小時欄位可能會導致時間不明確。
- 請參閱 ISO8601、I 和 T DateTime 記號。
- 分數秒以大寫 S 表示。 長度必須隱含地符合輸入上的格式符號數目。 例如,格式字串
ss SSS
或ss.SSS
代表秒和毫秒。 不過,格式字串ss.sss
代表重複的欄位 (以秒為單位); 句點 (.) 之後的值會視為秒欄位,而不是小數秒。 輸出會截斷至指定的長度。 - 在 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 月
- 使用格式字串 "
- 一個月中的第一個和最後一個星期可能包括來自相鄰月份的天數。 例如, 2006 年 7 月 31st 星期一可以表示為 2006 年 8 月第一週的星期一,即
2006 08 1 Monday
使用格式字串yyyy MM W EEEE
。 - 年份作為特殊案例來處理。
- 在輸出時,如果
y
的計數為2
,則年份會截斷為 2 位數。 例如,如果yyyy
產生1997
,則yy
產生97
。 - 在輸入時,若為 2 位數年份, 世紀視窗 會固定為 53。 例如,輸入日期 52 會產生年份值 2052 ,而輸入日期 53 則會產生輸出年份 1953 ,而 97 則會產生 1997。
- 在輸出時,如果
- 使用
zzz
選項可能會有不明確的結果。 例如,BST
可以解譯為Bangladesh Standard Time
或British Summer Time
。 基於相容性原因, IBM® App Connect Enterprise 會使用先前的解譯。若要避免這些問題,請使用具有明確定義名稱的
zzzz
選項; 例如, Europe/London、Asia/Dhaka 或 America/Los_Angeles。 - 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 ,您還必須指定日期。
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
。