如何解读20世纪的YearMonth日期?

时间:2016-08-10 10:24:34

标签: java java-time

如何强制YearMonth将两位数值解释为20世纪?

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

但我想得到:2016-11

当然我可以在之前的任何年份添加2000,但也许有更正确的方法?

3 个答案:

答案 0 :(得分:3)

YearMonth类旨在表示从-999,999,999(MIN_YEAR)到999,999,999(MAX_YEAR)的全部年份。因此,两位数年份(或实际上该范围内的任何数字)是有效输入,并将表示为“那一年”。

如果您想要更具限制性的行为,那么您需要创建自己的类,公开YearMonth的所有方法,然后修改构造函数以处理您希望的一年和两位数年份的特殊情况

答案 1 :(得分:1)

据您了解,您关心的是以某种方式映射到当前世纪的动态。那怎么样:

pleaseCheckPics(link)

它处理到当前世纪的映射,但也识别绝对年值。

输出是:

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

答案 2 :(得分:0)

如果您将输入值作为字符串格式为YY-MM,则可以使用DateTimeFormatter

解析字符串
DateTimeFormatter YYMM = DateTimeFormatter.ofPattern("yy-MM");
YearMonth ym = YearMonth.parse("16-11", YYMM);

但是,由于你已经拥有int,因此添加2000就没有错。