如何强制 java.time.LocalDate 假设 19 世纪为 YY 年份模式?
How to force java.time.LocalDate to assume 19th century as YY year pattern?
以下测试失败:'86
生日的格式为 2068
。如何格式化为 1986
?
@Test
public void testBirthday() {
assertEquals("1986-08-07", java.time.LocalDate.parse("070886",
java.time.format.DateTimeFormatter.ofPattern("ddMMyy")));
}
失败:
java.lang.AssertionError: expected:<1986-08-07> but was:<2086-08-07>
这与 org.joda.time
库有很大不同,后者会在此处正确假设 19'
。
/旁注:关于 "duplicate" 问题中的标记答案,我不认为这是重复的!
Java 8 的 LocalDate
class 默认使用 2000+ 作为年份。为了解析 1900 及更高版本的 yy
格式,您需要自己减少时间。
当然,即使您对照当前年份检查日期,如果是今天之后减去 100 年,此修复程序对 100 岁以上的人也不起作用。
您也可以使用 yyyy
格式。或者只是使用 Date
对象,如果您愿意,可以将其转换为 LocalDate
。
可以使用 DateTimeFormatterBuilder.appendValueReduced() 来控制基准年。
此代码将使用 1900 年而不是 2000 年的基准日期进行解析:
DateTimeFormatter f = new DateTimeFormatterBuilder()
.appendPattern("ddMM")
.appendValueReduced(ChronoField.YEAR, 2, 2, 1900)
.toFormatter();
LocalDate date = LocalDate.parse("070886", f);
以下测试失败:'86
生日的格式为 2068
。如何格式化为 1986
?
@Test
public void testBirthday() {
assertEquals("1986-08-07", java.time.LocalDate.parse("070886",
java.time.format.DateTimeFormatter.ofPattern("ddMMyy")));
}
失败:
java.lang.AssertionError: expected:<1986-08-07> but was:<2086-08-07>
这与 org.joda.time
库有很大不同,后者会在此处正确假设 19'
。
/旁注:关于 "duplicate" 问题中的标记答案,我不认为这是重复的!
Java 8 的 LocalDate
class 默认使用 2000+ 作为年份。为了解析 1900 及更高版本的 yy
格式,您需要自己减少时间。
当然,即使您对照当前年份检查日期,如果是今天之后减去 100 年,此修复程序对 100 岁以上的人也不起作用。
您也可以使用 yyyy
格式。或者只是使用 Date
对象,如果您愿意,可以将其转换为 LocalDate
。
可以使用 DateTimeFormatterBuilder.appendValueReduced() 来控制基准年。
此代码将使用 1900 年而不是 2000 年的基准日期进行解析:
DateTimeFormatter f = new DateTimeFormatterBuilder()
.appendPattern("ddMM")
.appendValueReduced(ChronoField.YEAR, 2, 2, 1900)
.toFormatter();
LocalDate date = LocalDate.parse("070886", f);