这可能看起来很奇怪,但是我看到,在将字符串转换为日期时,值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了解功能使用情况和示例
答案 0 :(得分:4)
这是预期和记录在案的行为,尽管令人惊讶。
Oracle documentation on fn-bea:date-from-string-with-format(...)
包含有关日期模式的以下注释(由我添加突出显示):
您可以使用标准Java类符号构建日期和时间模式。 [...]重复每个符号以匹配所需的最大字符数来表示实际值。 [...]
因此,OSB使用默认的Java日期模式,而YYYY
将日期设置为要求至少四位数年份声明,但允许任意更长的日期。例如,MM/dd/yyyy
匹配23/02/2014
和23/02/20155
;但不是23/02/42
。
查看Java specifications以验证这一点,即使是最后一个日期(第42年)也是允许的:
对于解析,如果模式字母的数量大于2,则无论数字位数如何,都按字面解释年份。所以使用模式" MM / dd / yyyy"," 01/11/12"解析到1月11日,12 A.D。
可能是OSB将自己的解析规则与Java日期类符号一起使用。
我没有验证OSB使用哪一个,但两个规范做允许YYYY
五位数。