Java 如何使用时区解析datetime,但不使用T或纳秒
我正在尝试以以下格式解析datetime字符串:Java 如何使用时区解析datetime,但不使用T或纳秒,java,datetime,Java,Datetime,我正在尝试以以下格式解析datetime字符串: 2019-02-22 19:29:43+00:00 我遵循以下指南: 这一行似乎是我试图解析的时间戳字符串: Z zone-offset offset-Z +0000; -0800; -08:00; 以下是我根据该指南创建的内容: String input = "2019-02-22 19:29:43+00:00"; DateTimeFormatter formatter =
2019-02-22 19:29:43+00:00
我遵循以下指南:
这一行似乎是我试图解析的时间戳字符串:
Z zone-offset offset-Z +0000; -0800; -08:00;
以下是我根据该指南创建的内容:
String input = "2019-02-22 19:29:43+00:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ssX");
LocalDateTime parsed = LocalDateTime.parse(input, formatter);
但我得到了这个错误:
java.time.format.DateTimeParseException: Text '2019-02-22 19:29:43+00:00' could not be parsed, unparsed text found at index 22
请尝试
yyyy-MM-dd HH:MM:ssXXX
。这应该能解决你的问题
偏移量X和X:
一个字母仅输出小时,如“+01”,除非分钟为非零,在这种情况下,也输出分钟,如“+0130”
两个字母输出小时和分钟,不带冒号,如“+0130”
三个字母输出小时和分钟,带有冒号,如“+01:30”
四个字母输出小时、分钟和可选秒,不带冒号,如“+013015”
五个字母输出小时、分钟和可选秒,并带有冒号,如“+01:30:15”
六个或六个以上的字母会引发IllegalArgumentException
根据下表中的说明:
编辑:
如果您希望使用该模式格式化日期,并希望使用相同的输出字符串,则应改用yyyy-MM-dd HH:MM:ssxxx
(请参见下文Andreas的注释)。tl;博士
•错误的类别:OffsetDateTime
,而不是LocalDateTime
•将默认使用的标准格式的空格替换为T
OffsetDateTime.parse( // Do NOT use `LocalDateTime` class, use `OffsetDateTime` because your input has an offset-from-UTC.
"2019-02-22 19:29:43+00:00"
.replace( " " , "T" ) // Replace SPACE in middle with a `T` to comply with ISO 8601 standard format.
) // Returns a `OffsetDateTime`.
看到这个了吗
错误类型
您的输入字符串包含一个
但是您试图将其解析为一个LocalDateTime
没有概念或因为它不代表一个时刻。所以您正在丢弃有价值的信息
相反,您应该作为一个用户进行解析
ISO 8601
您的输入字符串几乎是标准格式。要完全遵守,只需用<<代码> t>代码>替换中间的空间。
String input = "2019-02-22 19:29:43+00:00".replace( " " , "T" ) ;
在解析/生成字符串时,java.time类默认使用ISO 8601格式。因此,无需指定格式化模式
OffsetDateTime odt = OffsetDateTime.parse( input ) ;
关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,& 要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是 该项目现已启动,建议迁移到类 您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*
类
从哪里获得java.time类
- 、和更高版本-标准Java API的一部分,带有捆绑实现。
- Java9添加了一些次要功能和修复
- 及
- 大多数java.time功能都在中向后移植到Java6和Java7
-
- 更高版本的Android捆绑包实现了java.time类
- 对于早期的Android(哇。我想我试过XX:XX。我不太明白。这很有效。谢谢。因为问题示例显示
,它应该是'xxx',而不是'xxx',因为javadoc声明:“当输出的偏移量为零时,模式字母'X'(大写)将输出'Z'”.---对于解析来说,这没有什么区别,但是如果OP也想使用这种模式格式化,它应该被修复。@Andreas谢谢你提供的信息,我根据你的评论编辑了我的答案。+00:00