当前位置: 首页 > 知识库问答 >
问题:

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

巩才捷
2023-03-14

我正在使用此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
{DayOfMonth=15, MonthOfYear=7, WeekBasedYear=1990}

共有1个答案

施飞昂
2023-03-14

由于这个问题实际上是关于新的java.time-package而不是SimpleDateFormat,我将引用以下相关部分:

年:字母的计数决定了使用填充的最小字段宽度。如果字母数是两个,则使用简化的两位数形式。对于打印,这将输出最右边的两位数字。对于解析,这将使用基值2000进行解析,从而产生2000到2099(含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。关于你没有任何其他与周相关的字段的事实,我会假设是正常的日历年,而不是以周为基础的。

 类似资料:
  • 问题内容: 我正在使用此: 我想解析字符串150790,但出现此错误: 显然,我想得到以下内容: 您知道我为什么得到2090年而不是1990年吗? 谢谢你的帮助 问题答案: 由于这个问题确实与新包装有关,因此我不会引用以下相关章节: 年:字母的数量确定最小字段宽度,在该最小字段宽度以下使用填充。如果字母数为2,则使用简化的两位数形式。对于打印,这将输出最右边的两位数字。对于解析,这将使用2000的

  • 我有以下字符串: 我尝试用以下代码将此字符串转换为: Java . time . format . datetimeparseexception:无法解析文本“18/07/2019 04:30:00”:无法从TemporalAccessor获取LocalDateTime 我错过了什么?

  • 我试图用GMT解析一个表示日期的字符串,但它在我的PC(太平洋)上的时区中打印出来。当我运行下面的时,我得到下面的输出。关于如何让解析器解析并返回GMT日期有什么想法吗?如果您看下面,我正在使用format.settimezone(timezone.gettimezone(“GMT”))设置时区;但它并没有产生预期的结果。 以下代码的输出: 10月29日星期一05:57:00 PDT 2012

  • 问题内容: 我正在尝试对JavaScript应用程序中的日期进行序列化/反序列化。 服务器端,我使用Java,JodaTime已安装在上面。我发现了如何使用UTC时区序列化为ISO,但是找不到如何进行反向操作。 这是我的代码 我不在乎是否使用Joda,只需要一个快速且有效的解决方案, 问题答案: 如果您使用的是Java 7或更早版本,则可以参考此文章。 如果您使用的是Java 8,则可以执行以下操

  • 下面是SimpleDateFormat的设置。 下面是开发人员文档中可解析日期字符串的可能差异列表。正如您所看到的,它们中没有一个在时区中有冒号。 我的第二个问题是当我得到一个时区设置为Z的日期字符串时,这是将时区设置为GMT的标准,相当于0000。然而,我又得到了一个ParseException。下面是日期字符串的一个示例。 提前致谢

  • 问题内容: 我有一个日期字符串,我想使用java Date API将其解析为正常日期,以下是我的代码: 但是我有一个例外: 所以我想知道是否必须拆分字符串并手动解析它? 顺便说一句,我试图在T的两侧添加单引号字符: 它也不起作用。 问题答案: Java 8及更高版本的更新 现在,你可以简单地做得到正确的事情,尤其是因为你应该使用最新版本的而不是损坏的代码。 你也应该使用而不是。 原始答案: 就格式