2016-08-10 5 views
-2

Как я могу заставить YearMonth интерпретировать двузначное значение как 20-й век?Как интерпретировать YearMonth date в 20 веке?

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

Но я хотел бы получить: 2016-11.

Конечно, я мог бы добавить 2000 к любому знаку года раньше, но, возможно, есть более правильный способ?

+2

Вернее, чем 'YearMonth.of (2000 + год, месяц);'? Является ли год в 'int'? Может ли он прийти 2 цифры или 4 цифры? Пожалуйста, напишите больше информации о том, почему прямое решение вас не удовлетворяет. – Tunaki

+2

Если вы хотите, чтобы его интерпретировали как год в XX веке, добавьте 1900 вместо 2000. (Или вы имели в виду 21-й век?). В любом случае, что случилось с добавлением 1900 или 2000? Невозможно автоматически позволить «YearMonth» сделать это за вас. – Jesper

+0

@Tunaki как записанное значение года всегда указывается как двузначное значение. – membersound

ответ

3

Класс YearMonth предназначен для представления всего диапазона Years от -999,999,999 (MIN_YEAR) до 999,999,999 (MAX_YEAR). Из-за этого двухзначный год (или действительно любое число в этом диапазоне) является допустимым вводом и будет представлен как «в этом году».

Если вы хотите иметь более ограничительное поведение, вам необходимо создать свой собственный класс, который разоблачил все методы YearMonth, а затем изменит конструктор, чтобы иметь дело с особым случаем одного и двухзначных лет, которые вы бы как.

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

Он обрабатывает отображение в текущее столетие, но и признает о абсолютном значении года.

Выход:

2016-11 
2116-11 
1116-11 
0

В случае, если у вас есть входные значения в виде строки в формате YY-MM, можно разобрать строку с помощью DateTimeFormatter

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

Но у вас уже есть a int, нет ничего плохого в том, что просто добавьте 2000.