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日付パターン

Oraclefn-bea:date-from-string-with-format(...)のドキュメントには、日付パターンに関する次のメモが含まれています (強調表示は私が追加しました)。

標準の Java クラス シンボルを使用して、日付と時刻のパターンを作成できます。[...]実際の値を表すために必要な最大文字数に一致するように、各記号を繰り返します。[...]

そのため、OSB はデフォルトの Java 日付パターンを使用し、少なくともYYYY4 桁の年の宣言を必要とするように日付を設定しますが、任意のより長いものを許可します。たとえば、と;に一致します。しかしそうではありません。MM/dd/yyyy23/02/201423/02/2015523/02/42

Java 日付パターン

これを確認するためにJava 仕様を見ると、最後の日付 (42 年) も許可されます。

解析では、パターン文字の数が 2 を超える場合、年は桁数に関係なく文字どおりに解釈されます。したがって、パターン「MM/dd/yyyy」を使用すると、「01/11/12」は西暦 12 年 1 月 11 日と解析されます。

OSB が独自の構文解析規則を Java 日付クラス記号と一緒に使用している可能性があります。


どちらが使用されているかは OSB で確認しませんでしたが、どちらの仕様でもに 5 桁の年を使用できYYYYます。

于 2015-01-10T10:30:23.973 に答える