日期以yyyy-mm-dd格式不会报错

3

这可能看起来很奇怪,但是当我将一个字符串转换为日期时,值为20155-10-10时并没有抛出无效日期的错误。

使用的函数如下:

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

当传递上述字符串并通过模式验证时,上述函数返回日期2015年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查看该函数的使用方法和示例。

你的问题是你认为20155年10月10日不是一个有效的日期,还是你期望yyyy不匹配5位数的年份? - Matt Gibson
我期望yyyy不匹配5位数的年份。我知道20155是一个有效的年份。 - VamsiKrishna
听起来你发现了一个 bug!也许你应该向产品的作者报告它。 - Joe Wicentowski
1个回答

4
这是预期的和有文档记录的行为,尽管令人惊讶。
OSB日期模式
Oracle关于fn-bea:date-from-string-with-format(...)的文档包含以下有关日期模式的注释(我添加了突出显示):
您可以使用标准Java类符号构造日期和时间模式。[...]重复每个符号以匹配表示实际值所需的最大字符数。[...]
因此,OSB使用默认的Java日期模式,YYYY将日期设置为至少需要四位数字年份声明,但允许任意长度。例如,MM / dd / yyyy与23/02/2014和23/02/20155匹配; 但不匹配23/02/42。
Java日期模式

查看Java规范以验证此事,即使是最后日期(在第42年),也将被允许:

对于解析,如果模式字母的数量超过2个,则年份会被按照字面意思解释,而不考虑数字的数量。因此,使用模式“MM/dd/yyyy”,“01/11/12”将解析为公元12年1月11日。

可能OSB使用自己的解析规则与Java日期类符号一起使用。


我没有验证使用的是哪个操作系统,但是两种规范都允许使用五位数字年份 YYYY

在我看来,第一部分文档有点误导性/矛盾。“重复每个符号以匹配表示实际值所需的最大字符数”似乎意味着您需要yyyyy来表示20155,因为表示值20155所需的最大字符数是5,而不是4。(但我完全理解,在所有Y2K狂热之后,yyyy可能会被编码为“除了'Y2K问题'的'两位数年份'之外的任何东西,该死的...”,我们在这里看到的是指定和正确的Java行为。) - Matt Gibson
我读到这个短语时,“maximum”与“required”有关,四个Y需要四位数的年份,但是允许使用更多。但实际上,可能有很多变体可以阅读该短语... - Jens Erat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接