问题描述
以下内容非常适用:
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'
有人可以帮助我了解这里可能出什么问题吗?
1楼
我尝试使用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
,然后导致错误。
2楼
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:00
在2019-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中添加内容提供了一个试验场。 您可以在这里找到一些有用的类,比如 , , ,和 。
3楼
在startDateTime中有一个额外的零,请使用startDateTime =“ 2019-10-12T00:00:00.00 + 07:00”