2016-08-10 10 views
-2

YearMonthに20桁の2桁の値を解釈させるにはどうすればよいですか?20世紀のYearMonthの日付を解釈する方法は?

YearMonth.of(16, 11); //result: 0016-11

しかし、私は取得したいのですが:2016-11

もちろん、私は前に任意の年の数字に2000を追加することができますが、もっと正しい方法がありますか?

+2

「YearMonth.of(2000 + year、month);」よりも正確ですか?今年は 'int'の年ですか? 2桁でも4桁でもかまいませんか?直接の解決策があなたを満足させない理由について、より多くの情報を投稿してください。 – Tunaki

+2

20世紀に1年と解釈されたい場合は、2000年の代わりに1900を追加します(あるいは21世紀を意味しましたか?)。とにかく、1900年か2000年の追加で何が問題になったのですか?自動的に「YearMonth」があなたにそれをさせる方法はありません。 – Jesper

+0

@Tunakiと書かれた年の値は、常に2桁の値として提供されます。 – membersound

答えて

3

YearMonthクラスは、-999,999,999(MIN_YEAR)から999,999,999(MAX_YEAR)までのすべての年を表すように設計されています。そのため、2桁の年(またはその範囲内の任意の数値)が有効な入力であり、「その年」として表されます。

より制限的な動作をしたい場合は、YearMonthのすべてのメソッドを公開する独自のクラスを作成してから、1年と2桁の年の特別なケースに対処するためにコンストラクタを変更する必要があります好き。

1

あなたが気づいていることは、何とか現在の世紀にマッピングすることです。これは何について:

public static void main(String[] args) { 
    System.out.println(mapToCurrentCentury(16, 11)); 
    System.out.println(mapToCurrentCentury(116, 11)); 
    System.out.println(mapToCurrentCentury(1116, 11)); 
} 

private static YearMonth mapToCurrentCentury(int year, int month) { 
    if(year < 1000) { 
     YearMonth now = YearMonth.now(); 
     return now.withYear(((now.get(ChronoField.YEAR)/1000) * 1000) + (year % 1000)).withMonth(month); 
    } 
    else { 
     return YearMonth.of(year, month); 
    } 
} 

それはあなたの現在の世紀へのマッピングを処理するだけでなく、絶対年の価値について認識しています。

出力がある:あなたが形式YY-MMのStringとして入力値を持っている場合は

2016-11 
2116-11 
1116-11 
0

、あなたはDateTimeFormatter

DateTimeFormatter YYMM = DateTimeFormatter.ofPattern("yy-MM"); 
YearMonth ym = YearMonth.parse("16-11", YYMM); 

しかし、あなたが既に持っているように使用して文字列を解析することができintの場合、2000を追加するだけで問題はありません。

関連する問題