我正在使用这个 DateTimeFormatter:
DateTimeFormatter.ofPattern("ddMMYY")
我想解析字符串150790
我得到了这个错误:
Unable to obtain LocalDate from TemporalAccessor: {DayOfMonth=15, MonthOfYear=7, WeekBasedYear[WeekFields[MONDAY,4]]=2090},ISO of type java.time.format.Parsed
显然,我想得到以下内容TemporalAccessor
:
{DayOfMonth=15, MonthOfYear=7, WeekBasedYear=1990}
你知道为什么我得到的是 2090 年而不是 1990 年吗?
感谢您的帮助
因为这个问题确实是关于新的java.time
- 包而不是SimpleDateFormat
我将引用以下内容相关部分:
年份:字母数决定下面的最小字段宽度
使用哪种填充。如果字母数为两个,则减少
使用两位数形式。对于打印,这会输出最右边的两个
数字。对于解析,这将使用基值 2000 进行解析,
得出 2000 年至 2099 年(含)范围内的年份。
我们看到 Java-8 使用范围默认 2000-2099, 不喜欢SimpleDateFormat
相对于今天的范围 -80 年到 +20 年。
如果你想配置它,那么你必须使用追加值减少()。这是以一种不方便的方式设计的,但是可能的,请参见这里:
String s = "150790";
// old code with base range 2000-2099
DateTimeFormatter dtf1 =
new DateTimeFormatterBuilder().appendPattern("ddMMyy").toFormatter();
System.out.println(dtf1.parse(s)); // 2090-07-15
// improved code with base range 1935-2034
DateTimeFormatter dtf2 =
new DateTimeFormatterBuilder().appendPattern("ddMM")
.appendValueReduced(
ChronoField.YEAR, 2, 2, Year.now().getValue() - 80
).toFormatter();
System.out.println(dtf2.parse(s)); // 1990-07-15
顺便说一句,如果您确实想要基于周的年份,那么您必须使用 Y 而不是 y 或适当的字段IsoFields.WEEK_BASED_YEAR
。关于您没有任何其他与周相关的字段这一事实,我会假设正常的日历年,而不是基于周的日历年。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)