编程语言
首页 > 编程语言> > java – 将字符串解析为本地日期不使用所需的世纪

java – 将字符串解析为本地日期不使用所需的世纪

作者:互联网

我正在使用这个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-package而不是SimpleDateFormat,我将引用relevant section

Year: The count of letters determines the minimum field width below
which padding is used. If the count of letters is two, then a reduced
two digit form is used. For printing, this outputs the rightmost two
digits. For parsing, this will parse using the base value of 2000,
resulting in a year within the range 2000 to 2099 inclusive.

我们看到Java-8使用默认值2000-2099的范围,而不是像SimpleDateFormat那样,相对于今天的范围为-80年,直到20年.

如果你想配置它,那么你必须使用appendValueReduced().这是一个不方便的设计,但可能,请看这里:

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.关于您没有任何其他与周相关的字段的事实,我会假设正常的日历年,而不是基于周的日历年.

标签:java,date,java-time,2-digit-year
来源: https://codeday.me/bug/20190917/1810180.html