10

String「dd-MM-yy」形式をDateオブジェクトに解析しようとしています。問題は、日付の世紀を推測しようとすることです。

01 から 31 までを指定すると、年は 2000 年代 (21 世紀) と解釈され、32 t0 99 は 1900 年代 (20 世紀) と見なされます。

SimpleDateFormat fm =new SimpleDateFormat("dd-MM-yy");
String datestr="21-11-31";
try {
  Date date= fm.parse(datestr);
  System.out.println(date);
} catch (ParseException e) {
}

誰でも私を助けることができますか?私が21世紀にしかきちんと働いていないことをどのように指定できますか. 文字列を操作したり、条件に基づいて日付をシフトしたりするようなトリックを探しているわけではありません。

4

2 に答える 2

16

メソッドで 2 桁のデータ入力を解釈するために使用する世紀を変更できますset2DigitYearStart()

SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yy");
String aDate = "03/17/40";
Calendar cal = Calendar.getInstance();
cal.clear();
cal.set(Calendar.YEAR, 2000);
dateFormat.set2DigitYearStart(cal.getTime());
System.out.println(dateFormat.get2DigitYearStart());
System.out.println(dateFormat.parse(aDate));

2040 年 3 月 17 日に印刷されます。

于 2012-05-24T06:44:22.290 に答える
7

ドキュメントから:

省略された年パターン (「y」または「yy」) を使用して解析する場合、SimpleDateFormat は省略された年をある世紀に相対的に解釈する必要があります。これは、SimpleDateFormat インスタンスが作成された時点から 80 年前から 20 年間以内になるように日付を調整することによって行われます。たとえば、"MM/dd/yy" のパターンと 1997 年 1 月 1 日に作成された SimpleDateFormat インスタンスを使用すると、文字列 "01/11/12" は 2012 年 1 月 11 日と解釈され、文字列 "05/04/ 64" は 1964 年 5 月 4 日と解釈されます。解析中、Character.isDigit(char) で定義されているように、正確に 2 桁で構成される文字列のみがデフォルトの世紀に解析されます。1 桁の文字列、3 桁以上の文字列、またはすべてが数字ではない 2 桁の文字列 (「-1」など) など、その他の数値文字列。文字通りに解釈されます。したがって、「01/02/3」または「01/02/003」は、西暦 3 年 1 月 2 日と同じパターンを使用して解析されます。同様に、「01/02/-3」は、紀元前 4 年 1 月 2 日として解析されます。

範囲を調整する方法については言及していないようです[-80; +20]。最善の策は、2 桁の年を 4 桁の形式に拡張することだと思います。

datestr = datestr.replaceFirst("-(\\d{2})$", "-20$1");
于 2012-05-24T06:33:10.547 に答える