消息集:作为字符串数据的 DateTime
您可以使用由模式字母组成的字符串来指定 dateTime 格式。
当您将日期或时间转换为字符串时,必须应用格式模型来指导转换。 应用此格式模式将日期或时间转化为字符串或者将字符串转解析为日期或时间。
在转换时(例如,将日期时间转换为字符串),会使用等价源来替换模式或标记集。 下图显示了如何使用模式来格式化日期时间源以产生字符串输出。

解析字符串后(例如,将字符串转换为 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 | 时代 | 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 |
| ' | 文本的转义 | 'User text' | |
| " | (两个单引号)转义文本中的单引号 | 'o"clock' |
日期时间对象的表示取决于指定的符号。
- 文本:如果指定四个或四个以上的符号,将会显示完整的格式。 如果您指定的符号小于四个,将显示简短或缩略格式(如果存在)。 例如:
EEEE生成Monday,EEE生成Mon. - 数字:数值型日期时间部分的字符数必须在相应的格式化符号的限制范围内。 请重复使用同一符号以指定所需的最小位数。 允许的最大位数是特定符号的上限。 例如,月份中的第几天的上限为 31; 因此,格式字符串
d允许对值 2 或 21 进行解析,但不允许对值 32 或 210 进行解析。 在输出时,使用零将数字填充到指定长度。 年是特殊情况;见附注 8。 分数秒也是特殊情况;请参阅注释 5。 - 容错日期时间检查:解析器将范围外的日期时间值转换为相应的范围内的值。 例如,将日期 2005-05-32 转换为 2005-06-01。 日期时间的输出始终遵循符号计数。 例如,以下项的格式化字符串:
yyyy-MM-dd(其中 "-" 是字段分隔符) 允许对一个或多个字符进行语法分析MM和dd。此转换允许输入无效的日期 (例如 2006-01-123 和 2006-011-12)。 值 2006-01-123 编写为日期 2006-05-03,而值 2006-011-12 编写为日期 2006-11-12。 时区格式符号 Z 出现的数目仅适用于输出 dateTime 格式。 空格被跳过。 - 物理类型:如果将 dateTime 对象的物理类型属性指定为压缩十进制,那么只有表示数字的模式格式化符号有效;即,表中“表示”列中包含“数字”的那些符号有效。 在格式模式中不允许使用其他字符。 例如,yyyyMMdd 有效,但是 yyyyMMMdd 无效,这是因为 MM 是月份的数字表示,而 MMM 是月份的文本表示。
- 模式中的任何不在 ['a'..'z'] 和 ['A'..'Z'] 范围内的字符被视为引用的文本。 例如,冒号 (:)、逗号 (,)、句点 (.)、数字符(井号 #)、@ 符以及空格等字符将出现在所生成的时间文本中,即使这些字符未括在单引号内也是如此。
- 您可能创建产生不可预测结果的格式字符串;因此必须谨慎使用这些符号。 例如,如果您指定
dMyyyy,是无法区分日,月和年的。dMyyyy指示集成节点至少有一个字符表示日期,至少有一个字符表示月份,有四个字符表示年份。 因此3112006可能解释为 2006 年 11 月 3 日或 2006 年 1 月 31 日。
- “一周中的某一天”字段是一周中的数字偏移量并且会根据物理消息集属性一周中的第一天而改变。 例如,如果将物理消息集属性一周中的第一天设置为星期一,那么一周中的第三天就是星期三。
- 12th 2006 年 7 月是 7 月的第二个星期三,可以表示为
2006 July Wednesday 2使用格式字符串yyyy MMMM EEEE F。请注意,此格式不表示 2006 年 7 月 2 日的第 2 周的星期三,即 5th 2006 年 7 月; 此格式的字符串为yyyy MMMM EEEE W. - 如果使用冲突的 am/pm 字段指定,24 小时字段可能产品有歧义的时间。
- 请参阅 ISO8601, I 和 T 日期时间标记。
- 小数秒由大写 S 表示。 长度必须与输入中格式符号数目隐式匹配。 格式字符串
ss SSS或ss.SSS例如,表示秒数和毫秒数。 但是,格式字符串ss.sss表示重复字段 (以秒为单位); 周期 (.) 后的值将作为秒字段,而不是作为小数秒。 输出将截断到指定长度。 - 一年的开始通常是在一周的某天。 如果这一周中的天数小于一年中第一个星期的天数物理消息集属性所指定的值,就认为这一周是上一年的最后一周;因此第一周从新年中的某天开始。 否则,就认为这一周是新年的第一周;在这种情况中,第一周在新年前的之几天开始。 例如, 2004 年第 1 周的星期一 (2004 年第 1 周的星期一,其中每年第 1 周 4 天数 = 4 ,第 1 周的第 1 天 = 星期一) 使用格式字符串
YYYY ww EEEE实际上是 29th 2003 年 12 月。 如果您使用Y,一周中的第几天 (E) 和一年中的周 (w) 在必要时进行调整,以指示日期在上一年。如果使用小写字母
y符号,那么不会进行调整,并且可能会对年底前后的日期产生不可预测的结果。 例如,如果将字符串 2002 01 Monday 格式化:- 2002 年第 1 周的星期一 (使用格式字符串)
YYYY ww EEEE正确解释为31st December 2001 - 2002 年第 1 周的星期一 (使用格式字符串)
yyyy ww EEEE被错误地解释为30th December 2002
使用
Y与w仅当您未指定w,使用y. - 2002 年第 1 周的星期一 (使用格式字符串)
- 一月中的第一周和最后一周可能包含相邻月份的天数。 例如,周一 31st 2006 年 7 月可以表示为 2006 年 8 月第一周的星期一,即
2006 08 1 Monday使用格式字符串yyyy MM W EEEE. - 年是作为特殊情况处理的:
- 在输出时,如果计数为
y是2,年份将截断为 2 位数字。 例如,如果yyyy生成2006,yy生成06. - 在输入时,对于 2 位数年份,将使用物理消息集属性世纪的开始采用 2 位数年份来确定世纪。 例如,如果将世纪的开始采用 2 位数年份设置为 53,97 年将是 1997,52 年是 2052,而 53 年是 1953。
- 在输出时,如果计数为
- 使用
zzz选项可能有不明确的结果。 例如:BST可以解释为Bangladesh Standard Time或British Summer Time. 出于兼容性原因, IBM® Integration Bus 使用先前的解释。要避免这些问题,请使用
zzzz具有明确定义的名称的选项; 例如,欧洲/伦敦,亚洲/达卡或美洲/洛杉矶。 - 秒
s&ss,必须在范围 0-59 内。 如果您需要构造一个 TIMESTAMP 来表示闰秒期间的时间,且要创建或强制转换的值要使用值 60 作为秒数,那么您必须在 ESQL 代码中处理此情况。 产品中的 CURRENT_ datetime 函数(例如 CURRENT_TIME)从不会生成秒值超出 0-59 范围的时间。
ISO8601、I 和 T 日期时间标记
如果日期时间值符合 ISO8601:2000“日期和时间表示”标准,请考虑使用格式符号 I 和 T,这些符号与以下 ISO8601 标准子集相匹配。
- 由 W3C at http://www.w3.org/TR/NOTE-datetime 建议的受限概要文件
- 如 ISO8601:2000 的 5.2.1.3 节中指定的日历日期舍位表示
- 基本格式(子节 c、e 和 f)
- 扩展格式(子节 a、b 和 d)
格式化符号 I 和 T 只能单独使用:
- I 格式符号与符合受支持子集的任何日期时间字符串相匹配。
- T 格式符号与所有符合仅包含时间部分的受支持子集的 dateTime 字符串匹配。
下表显示了输出格式如何与逻辑数据类型相关联。
| 逻辑模型数据类型 | 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 都接受“+00:00”和“Z”来表示与全球标准时间(UTC)的零时差,但是在输出时将总是产生“+00:00”。 如果要在输出时始终产生“Z”,请改为使用 IU 或 TU 格式符号。
- ZZZ 总是编写 '+00:00' 来表示与全球标准时间 (UTC) 的零时差。 如果要在输出时始终产生“Z”,请改为使用 ZZZU。
在输出时使用输入 UTC 格式
如果某个元素或属性的逻辑类型 xsd:dateTime 或 xsd:time 包含作为字符串的 dateTime,就可以通过使用 Z 符号或时区 +00:00 来指定全球标准时间 (UTC)。 在输入时 MRM 解析器会记住此类元素和属性的 UTC 格式。 在输出时,您可以通过使用元素或属性的缺省 DateTime 格式属性指定应该显示 Z 还是 +00:00。 或者,您可以通过选中在输出时使用输入 UTC 格式消息集属性来保留输入 UTC 格式。 如果选中此属性,那么 UTC 格式将保留在输出消息中并覆盖日期时间格式属性隐含的格式。
示例
下表显示了一些日期时间格式的示例。
| 格式模式 | 结果 |
|---|---|
| "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 |
