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

Java 8 local datetime zoned datetime无法解析时区日期

梁晋鹏
2023-03-14

我正在尝试使用Java 8新的日期模式而不是Joda,我有以下问题:

两者都有

ZonedDateTime.parse("02/05/16 11:51.12.083 +04:30", DateTimeFormatter.ofPattern("dd/MM/yy HH:mm.ss.SSS Z"))

LocalDateTime.parse("02/05/16 11:51.12.083 +04:30", DateTimeFormatter.ofPattern("dd/MM/yy HH:mm.ss.SSS Z"))

引发“Java . time . format . datetimeparseexception”异常。正在…

org.joda.time.DateTime.parse("02/05/16 11:51.12.083 +04:30", DateTimeFormat.forPattern("dd/MM/yy HH:mm.ss.SSS Z"))

工作正常。

异常的原因是:

Java . time . format . datetimeparseexception:无法在索引22处分析文本“02/05/16 11:51.12.083 04:30”

我做错什么了吗?

共有3个答案

公西岳
2023-03-14

使用<code>DateTimeFormatterBuilder

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
      .appendValue(ChronoField.DAY_OF_MONTH, 2)
      .appendLiteral('/')
      .appendValue(ChronoField.MONTH_OF_YEAR, 2)
      .appendLiteral('/')
      .appendValueReduced(ChronoField.YEAR, 2, 2, 2000)
      .appendLiteral(' ')
      .appendValue(ChronoField.HOUR_OF_DAY)
      .appendLiteral(':')
      .appendValue(ChronoField.MINUTE_OF_HOUR)
      .appendLiteral('.')
      .appendValue(ChronoField.SECOND_OF_MINUTE)
      .appendLiteral('.')
      .appendValue(ChronoField.MILLI_OF_SECOND)
      .appendLiteral(' ')
      .appendOffsetId()
      .toFormatter();

OffsetDateTime.parse("02/05/16 11:51.12.083 +04:30", formatter);
能逸清
2023-03-14

我在这篇文章中找到了答案:结肠分隔时区的不可解析日期

为了解析一个时间戳,该时间戳带有一个分号的时区,而不是DateForgate javadoc所示的X或Z,您需要使用XXX。所有以下工作:

LocalDateTime.parse("02/05/16 11:51.12.083 +04:30", DateTimeFormatter.ofPattern("dd/MM/yy HH:mm.ss.SSS XXX"))

OffsetDateTime.parse("02/05/16 11:51.12.083 +04:30", DateTimeFormatter.ofPattern("dd/MM/yy HH:mm.ss.SSS XXX"))

ZonedDateTime.parse("02/05/16 11:51.12.083 +04:30", DateTimeFormatter.ofPattern("dd/MM/yy HH:mm.ss.SSS XXX"))
楮乐邦
2023-03-14

如果你阅读了DateTimeFormatterjavadoc,你会发现一个部分详细介绍了如何使用Z偏移量(强调我的):

偏移量Z:根据模式字母的数量格式化偏移量。一个、两个或三个字母输出小时和分钟,不带冒号,如“0130”。当偏移为零时,输出将为“0000”。四个字母输出本地化偏移量的完整形式,相当于偏移量-O的四个字母。如果偏移为零,输出将是相应的本地化偏移文本。五个字母输出小时、分钟和可选的秒(如果非零),并带冒号。如果偏移为零,则输出“Z”。六个或多个字母抛出IllegalArgumentException。

因此,使用5 Zs将按预期工作:

ZonedDateTime.parse("02/05/16 11:51.12.083 +04:30",
                    DateTimeFormatter.ofPattern("dd/MM/yy HH:mm.ss.SSS ZZZZZ"));

请注意,您可以通过以下方式获得类似的结果:

  • z
  • zz
  • zzz
  • zzzz
  • xxx
  • XXX
  • xxxxx
  • XXXXX
 类似资料:
  • 问题内容: 我有一个字符串日期“ 31-Dec”和模式“ dd-MMM”。接下来的代码 产生异常 我做错什么了? 谢谢! 问题答案: 一个问题可能是您不是英语。试试这个: 这为我返回: 1970年12月31日星期四00:00:00欧洲中部时间 由于日期字符串中缺少年份,因此您会看到它会自动插入为年份。

  • 问题内容: 我想将Twitter响应中的日期字符串转换为Date对象,但是我总是得到ParseException,并且看不到错误! 输入字符串:2010年12月23日星期四18:26:07 +0000 模式: 方法: 我也尝试过此方法:http : //friendpaste.com/2IaKdlT3Zat4ANwdAhxAmZ,但结果相同。 我在Mac OS X上使用Java 1.6。 干杯,

  • 我想在JavaScript中解析没有时区的日期。我试过:

  • 问题内容: 我正在尝试解析一个日期,但是奇怪的是我遇到了一个例外。 这是代码: 例外是: 我已经阅读了文档,我认为我的模式是正确的。所以我不明白… 问题答案: 这可能是因为你计算机上的默认语言环境不是英语。 你应该使用: 代替。

  • 问题内容: 我收到以下错误:“ java.text.ParseException:无法解析的日期:“ 2011年8月31日09:53:19””具有以下格式: 有人看到这个问题吗? 问题答案: 确保您使用正确的语言环境。(构造函数使用 系统默认的语言环境 ,它可能不是您要使用的 语言环境 。) 这在我的机器上工作正常: (例如,使用时会产生。)

  • 我遇到一个问题 错误:(16,10)java:log无法解析