11

こんにちは私はカスタムフォーマット文字列で設定された単純な日付フォーマットを持っています:MMddyy

そして私はそれに解析するために次の値を与えます:4 1 01

スペースがあるため、これを解析する必要はないと思いますが、SimpleDateFormatは日付を返します

0001AD年4月4日

なぜ何かアイデア?

4

3 に答える 3

10

これは予想される動作です。日付の 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 日になります。

于 2011-04-06T10:44:18.497 に答える
2

パターンのサイズ (繰り返される文字の数)を解析する場合、対応するテキストの予想されるサイズではありません。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
于 2011-04-06T14:05:16.967 に答える
0

2 桁の年はあいまいです。したがって、01 で終わる最初の年を 0001 と想定しています。文字列操作を使用して、4 桁の年に変換できますか?

于 2011-04-06T10:11:45.837 に答える