こんにちは私はカスタムフォーマット文字列で設定された単純な日付フォーマットを持っています:MMddyy
そして私はそれに解析するために次の値を与えます:4 1 01
スペースがあるため、これを解析する必要はないと思いますが、SimpleDateFormatは日付を返します
0001AD年4月4日
なぜ何かアイデア?
こんにちは私はカスタムフォーマット文字列で設定された単純な日付フォーマットを持っています:MMddyy
そして私はそれに解析するために次の値を与えます:4 1 01
スペースがあるため、これを解析する必要はないと思いますが、SimpleDateFormatは日付を返します
0001AD年4月4日
なぜ何かアイデア?
これは予想される動作です。日付の 6 文字の文字列表現を期待するように DateFormat オブジェクトに指示しています。これが渡されたものです。スペースは問題なく解析されます。ただし、「4x1x01」を使用するとエラーが発生します。解析するとき、寛大さはデフォルトで true に設定されることに注意してください。
DateFormat df = new SimpleDateFormat("MMddyy");
Date date = df.parse("4 1 01"); // runs successfully (as you know)
DateFormat df = new SimpleDateFormat("MMddyy");
Date date = df.parse("41 01"); // 5 character String - runs successfully
DateFormat df = new SimpleDateFormat("MMddyy");
df.setLenient(false);
Date date = df.parse("41 01"); // 5 character String - causes exception
DateFormat df = new SimpleDateFormat("MMddyy");
Date date = df.parse("999999"); // 6 character String - runs successfully
DateFormat df = new SimpleDateFormat("MMddyy");
df.setLenient(false);
Date date = df.parse("999999"); // 6 character String - causes exception
leniency が true に設定されている場合 (デフォルトの動作)、解析は無効な入力を解読しようとします。たとえば、31 日の月の 35 日が翌月の 4 日になります。
パターンのサイズ (繰り返される文字の数)を解析する場合、対応するテキストの予想されるサイズではありません。javadoc から、関連するさまざまなプレゼンテーション タイプについて:
- Number : 解析では、隣接する 2 つのフィールドを区切る必要がない限り、パターン文字の数は無視されます。
- Year : 解析中、正確に 2 桁の […] で構成される文字列のみがデフォルトの世紀に解析されます。1 桁の文字列、3 桁以上の文字列、またはすべてが数字ではない 2 桁の文字列 ("-1" など) など、その他の数値文字列は文字どおりに解釈されます。したがって、「01/02/3」または「01/02/003」は、同じパターンを使用して解析されます
- Month : パターン文字の数が 3 つ以上の場合、月はテキストとして解釈されます。それ以外の場合は、数値として解釈されます。
空白により、パーサーは実際のフィールドの解析を停止し(末尾のスペースは数値には無効です)、次のフィールドから開始します。パターンにはこれら 2 つのフィールド間にスペースがないため、使用されず、2 番目のフィールドの一部になります (先頭のスペースは有効です)。そのため、取得された年は「正確に 2 桁」ではなく、デフォルトの世紀に解析されません。
解析テスト (lenient
に設定false
):
FORMAT TEXT RESULT (ISO yyyy-MM-dd)
-------------------------------------------------
dddyy 01011 2011-01-10
dddyy 10 11 0011-01-10 (year is 3 chars: " 11")
dddyy 10 1 0001-01-10 (year is 2 char but not 2 digits: " 1")
dddy 01011 2011-01-10 ("y" same as "yy")
dd yy 10 11 2011-01-10 (ok, whitespace is consumed, year: "11")
d/y 3/4 0004-01-03 (year is not 2 digits)
d/y 3/04 2004-01-03
M/d/y 4/6/11 2011-04-06
2 桁の年はあいまいです。したがって、01 で終わる最初の年を 0001 と想定しています。文字列操作を使用して、4 桁の年に変換できますか?