当前位置: 代码迷 >> java >> 将字符串解析为LocalDateTime时出现DateTimeParseException tl; dr LocalDateTime是错误的类 OffsetDateTime 世界标准时间 ZonedDateTime 关于java.time
  详细解决方案

将字符串解析为LocalDateTime时出现DateTimeParseException tl; dr LocalDateTime是错误的类 OffsetDateTime 世界标准时间 ZonedDateTime 关于java.time

热度:88   发布时间:2023-07-31 12:10:18.0

以下内容非常适用:

String startDate = "2019-10-12T00:00:00.000-07:00"

LocalDateTime startDateTime = LocalDateTime.parse(startDate,
    DateTimeFormatter.ISO_ZONED_DATE_TIME);

但是,对于以下代码:

String startDate = "2019-10-12T00:00:00.000+07:00"

LocalDateTime startDateTime = LocalDateTime.parse(startDate,
    DateTimeFormatter.ISO_ZONED_DATE_TIME);

我有一个例外:

引发java.time.format.DateTimeParseException :无法在索引23处解析文本'2019-10-12T00:00:00.000 07:00'

有人可以帮助我了解这里可能出什么问题吗?

我尝试使用LocalDateTime的相同解析在本地运行两个日期,并且它们都正确运行

我可以通过使用不同的日期(请注意区域偏移量处的空格 ,而不是+- )来重新创建相同的错误2019-10-12T00:00:00.000 07:00而不是2019-10-12T00:00:00.000+07:00 错误消息显示的是什么(但代码没有显示)。

您确定显示的使用2019-10-12T00:00:00.000+07:00的代码版本是产生错误的实际版本吗? 看来您一直在使用2019-10-12T00:00:00.000 07:00 ,然后导致错误。

tl; dr

(A)如评论中所述,错误消息中+字符的消失是可疑的。 您可能有字符编码问题。 我们这里没有足够的信息来诊断。

(B)使用OffsetDateTime而不是LocalDateTime来适合您的数据。

OffsetDateTime
.parse( "2019-10-12T00:00:00.000+07:00" )
.toInstant()
.toString()

2019-10-11T17:00:00Z

看到此 。

LocalDateTime是错误的类

LocalDateTime类缺少任何时区或从UTC偏移的概念。 因此,根据定义,它不能代表一个时刻。 对象不是时间轴上的点。

然而,你输入的字符串表示偏移从-UTC的+07:002019-10-12T00:00:00.000+07:00 您尝试将此值放入LocalDateTime是不合适的,是的 。

当您表示时间轴上的特定时刻,特定点时,切勿使用LocalDateTime 目前或过去,此类类几乎从未在面向业务的应用程序中使用。 将来进行约会时,无论政客是否重新定义该地区的时区,只要您希望时间保持不变,都应使用此类。

OffsetDateTime

解析为对象。

您的输入字符串恰好完全符合用于文本日期时间格式的标准。 解析/生成字符串时, java.time类默认使用这些格式。 因此,无需指定格式化模式。

String input = "2019-10-12T00:00:00.000+07:00" ;
OffsetDateTime odt = OffsetDateTime.parse( input ) ;

世界标准时间

要适应的挂钟时间(偏移量为零),请调用 。 为了方便起见,请使用常量 。

OffsetDateTime odtUtc = odt.withOffsetSameInstant( ZoneOffset.UTC ) ;

或者简单地在java.time中提取基本构建基类的对象 ,即Instant 根据定义, 始终使用UTC。

Instant instant = odt.toInstant() ;

ZonedDateTime

要查看特定区域(时区)的人们在墙上时钟所看到的相同时刻,请应用ZoneId以获得ZonedDateTime

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;

关于java.time

框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧的日期时间类,例如 , 和 。

现在处于的项目建议迁移到类。

要了解更多信息,请参见 。 并在Stack Overflow中搜索许多示例和说明。 规格为 。

您可以直接与数据库交换java.time对象。 使用与或更高版本兼容的 。 不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

  • , , , 和更高版本-标准Java API的一部分,具有捆绑的实现。
    • Java 9添加了一些次要功能和修复。
    • 大多数java.time功能都在 Backport中反向移植到Java 6和7。
    • 更高版本的Android捆绑了java.time类的实现。
    • 对于早期的Android(<26), 项目改编了 (如上所述)。 请参阅 。

项目使用其他类扩展了java.time。 该项目为将来可能在java.time中添加内容提供了一个试验场。 您可以在这里找到一些有用的类,比如 , , ,和 。

在startDateTime中有一个额外的零,请使用startDateTime =“ 2019-10-12T00:00:00.00 + 07:00”

  相关解决方案