2012-05-24 8 views
8

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

01から31に指定すると、年は2000年代(21世紀)と解釈され、32年生は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世紀だけでうまく働いているとどのように指定することができますか?私は、文字列を操作するか、条件に基づいて日付をシフトするようなトリックを探すことを試みているわけではありません。 documentationから

+0

を印刷します。 's /([0-9] {2} - [0-9] {2}) - ([0-9] {2})/ $ 1-20 $ 2 /'です。 – zebediah49

+0

なぜ私は入力が短い年式であるのか不思議です。あなたは長い年の形式で入力を得ることができますか?別のオプションは、日付を解析する前にregexを使用してyearフィールドに "20"を追加することです。 ( " - (?! - )"、 "-20") – nhahtdh

+0

私は文字列操作だけで実装しています。それはAPIの方法があるかもしれないと思ったのです – Edge

答えて

12

あなたはそれがset2DigitYearStart()方法で2桁のデータ入力を解釈するために使用する世紀を変更することができます。

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)); 

は、私はあなたがすべての日付が21世紀であることを指定したい場合、あなたは愚かな文字列操作を行うオフ、実際にはおそらく優れていると信じている3月17日、2040

+1

+1 - Nice find。うまくいけばupvote電車が戻って来る:) –

+0

私は実際にこれを探していた。私はちょうど文字列manupulationに固執するつもりですが、私はget2DigitYearStart()について知っていなかった私の意図した質問に答える。 Thanx – Edge

+0

Year 2000を一度計算して工場に保管すれば、カレンダー操作のコストを無くして乱雑さを隠すことができます。どちらかの方法で動作します! – Affe

6

略し年パターン(「y」または「yy」)で解析するため、SimpleDateFormatは特定の世紀に合わせて短縮年を解釈する必要があり。これは、SimpleDateFormatインスタンスが作成されてから80年前と20年以内の日付に調整することで行います。たとえば、1997年1月1日に作成された「MM/dd/yy」パターンと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"は、1月2日のADと同じパターンを使用して解析されます。同様に、 "01/02/-3"はJan 2、4 BCと解釈されます。

[-80; +20]の範囲を調整する方法は言及されていません。私はあなたの最善の策は、4桁の形式に2桁の年拡大している疑いがある:

datestr = datestr.replaceFirst("-(\\d{2})$", "-20$1"); 
+0

APIがこれらの聖なる言葉の理解。アーメン。 – zebediah49

+0

私はこれを理解していますが、それは本当に私の質問に答えるものではありません。私たちが特定の世紀に取り組んでいるかどうかをJVMに伝えるうえで、きちんとした方法がありますか? – Edge

+0

@Edge:私の答えの一番下の段落を見てください。 – NPE

関連する問題