3

好吧,这可能看起来很奇怪,但我看到,在将字符串转换为日期时,值 20155-10-10 并没有抛出错误,说明日期无效。

使用的功能如下

fn-bea:date-from-string-with-format("MM/dd/yyyy",'10/10/20155')

上面的函数返回日期 20155-10-10,当上面的字符串被传递并且也被模式验证时。该字段被声明为类型 xs:date

函数的原型是

fn-bea:date-from-string-with-format($format as xs:string?, $dateString as xs:string?) as xs:date?

请按照链接http://docs.oracle.com/cd/E13167_01/aldsp/docs25/xquery/extensions.html#wp1297249了解函数用法和示例

4

1 回答 1

4

这是预期和记录的行为,尽管令人惊讶。

OSB日期模式

关于日期模式的Oracle 文档包含以下注释(我添加的突出显示):fn-bea:date-from-string-with-format(...)

您可以使用标准 Java 类符号构造日期和时间模式。[...] 重复每个符号以匹配表示实际值所需的最大字符数。[...]

因此,OSB 使用默认的 Java 日期模式,并将YYYY日期设置为需要至少四位数的年份声明,但允许任意更长的年份。例如,MM/dd/yyyy匹配23/02/201423/02/20155;但不是23/02/42

Java 日期模式

查看Java 规范来验证这一点,即使是最后一个日期(42 年)也是允许的:

对于解析,如果模式字母的数量超过 2 个,则按字面解释年份,而不考虑位数。所以使用模式 "MM/dd/yyyy", "01/11/12" 解析到公元 12 年 1 月 11 日

可能是 OSB 使用自己的解析规则和 Java 日期类符号。


我没有根据 OSB 验证使用的是哪一个,但两种规范允许YYYY.

于 2015-01-10T10:30:23.973 回答