2015-09-10 3 views
6

d/M/yyのようなパターンを使用している場合(例えば、DateTimeFormatter.ofPattern(pattern);を使用して構文解析に使用する)、2文字の年をすべて20xxと解釈します。たとえば、13/5/99のような文字列を次のように解析します。 と解釈されますが、私の場合は間違っています(これは1999年のものです)。Java 8 DateTimeFormatterで2文字の年を解析するための基準日を変更するにはどうすればよいですか?

私のアプリケーションでは、OCRの文書の日付を解析しようとしています。 90年代のため、以前の80年前と20年後の日付を解釈する古いSimpleDateFormatの動作は私にはうまく合っていますが、さまざまな理由から、日付解析のロジック全体を新しいものに切り替えることを検討していますJava 8 DateTimeFormatters。

Javaソースコードを見ると、これはすべて定数ReducedPrinterParser.BASE_DATEに関連して解釈されていますが、パターンから自分のフォーマッタを構築するときに使用する値を変更する方法はありません。これは単純に可能ではないのですか、または2文字の年を解析するための振る舞いを指定する可能性を忘れていますか?

あなたが d/M/yyパターンのために、たとえば、カスタムフォーマッタを作成することができます
+0

[文字列をパースすることの可能な重複現地日は希望の世紀を使用していない](http://stackoverflow.com/questions/29490893/parsing-string-to-local-date-doesnt-use-desired-century) –

答えて

9

new DateTimeFormatterBuilder() 
     .appendPattern("d/M/") 
     .appendValueReduced(ChronoField.YEAR_OF_ERA, 2, 2, LocalDate.now().minusYears(80)) 

使用例:

public static void main(String[] args) throws Exception { 
    DateTimeFormatter fmt = new DateTimeFormatterBuilder() 
      .appendPattern("d/M/") 
      .appendValueReduced(ChronoField.YEAR_OF_ERA, 2, 2, LocalDate.now().minusYears(80)) 
      .toFormatter(); 
    parse("13/5/99", fmt); 
    parse("13/5/36", fmt); 
    parse("13/5/35", fmt); 
    parse("13/5/34", fmt); 
    parse("13/5/33", fmt); 
} 

private static void parse(String date, DateTimeFormatter fmt) { 
    System.out.println(date + " = " + LocalDate.parse(date, fmt)); 
} 

出力します

13/5/99 = 1999-05-13
13/5/36 = 1936-05-13
13/5/35 = 1935年5月13日
13/5/34 = 2034年5月13日
13/5/33 = 2033年5月13日

+0

ちょっと面倒(私は基本的にはパターンの私の既存のリストを解析し、 "yy"が含まれているかどうかを確認して記述したようなフォーマッタを構築する)、しかし、そのことは間違いなく実行可能です。そのように! – David

+2

ああ、同じ問題を抱えている人々のヒント:appendValueReduced(ChronoField.YEAR_OF_ERA、2,4、LocalDate.now()。minusYears(80))は、2文字と4文字の年の両方を解析する機能を提供します! – David

関連する問題