2016-08-10 2 views
-2

Wie kann ich YearMonth zwingen, einen zweistelligen Wert als 20. Jahrhundert zu interpretieren?Wie interpretiere ich das JahrMonat im 20. Jahrhundert?

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

Aber ich würde bekommen: 2016-11.

Natürlich könnte ich einfach 2000 zu einem Jahr Ziffer zuvor hinzufügen, aber vielleicht gibt es einen richtigen Weg?

+2

Korrekter als 'YearMonth.of (2000 + Jahr, Monat);'? Ist das Jahr in einem "int"? Kann es zweistellig oder auch vierstellig sein? Bitte posten Sie weitere Informationen, warum die direkte Lösung Sie nicht zufriedenstellt. – Tunaki

+2

Wenn Sie möchten, dass es als ein Jahr im 20. Jahrhundert interpretiert wird, fügen Sie 1900 statt 2000 hinzu. (Oder meintest du das 21. Jahrhundert?). Wie auch immer, was ist falsch daran, 1900 oder 2000 hinzuzufügen? Es gibt keine Möglichkeit, automatisch 'YearMonth' das für Sie tun zu lassen. – Jesper

+0

@Tunaki wie geschrieben der Jahreswert wird immer als zweistelliger Wert angegeben. – membersound

Antwort

3

Die YearMonth-Klasse soll den gesamten Bereich der Jahre darstellen, von -9999999999 (MIN_YEAR) bis 999.999.999 (MAX_YEAR). Aus diesem Grund ist ein zweistelliges Jahr (oder eine beliebige Zahl in diesem Bereich) eine gültige Eingabe und wird als "dieses Jahr" dargestellt.

Wenn Sie ein restriktiveres Verhalten haben möchten, dann müssten Sie Ihre eigene Klasse erstellen, die alle Methoden von YearMonth verfügbar machen und dann den Konstruktor ändern, um mit dem Sonderfall von ein und zweistelligen Jahreszahlen umzugehen mögen.

1

Soweit zu verstehen, geht es dir darum, das aktuelle Jahrhundert irgendwie dynamisch zu kartieren. Was dazu:

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

Es um die Zuordnung zu Ihrem aktuellen Jahrhundert behandelt, sondern erkennt auch über einen absoluten Jahre Wert.

Ausgang ist:

2016-11 
2116-11 
1116-11 
0

Falls Sie die Eingabewerte als String im Format JJ-MM haben, können Sie den String mit einem DateTimeFormatter

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

analysieren könnte Aber wie Sie schon haben ein int, es ist nichts falsch mit nur 2000 hinzufügen.

Verwandte Themen