java - 如何使用时区解析日期时间,但没有 T 或纳秒

标签 java datetime

我正在尝试解析以下格式的日期时间字符串:

2019-02-22 19:29:43+00:00

我正在遵循本指南: https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

这个特定的行似乎是我要解析的时间戳字符串:

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

最佳答案

tl;dr

类错误:OffsetDateTime,而不是LocalDateTime

将 SPACE 替换为 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`.

查看此 code run live at IdeOne.com.

类型错误

您的输入字符串包含一个 offset-from-UTC .

但是您正在尝试将其解析为 LocalDateTime. LocalDateTime 没有 time zone 的概念或 offset-from-UTC因为它代表一个时刻。所以,square peg, round hole .您正在丢弃有值(value)的信息。

相反,您应该解析为 OffsetDateTime .

ISO 8601

您的输入字符串几乎符合标准 ISO 8601格式。要完全遵守,只需将中间的 SPACE 替换为 T

String input = "2019-02-22 19:29:43+00:00".replace( " " , "T" ) ;

java.time 类在解析/生成字符串时默认使用 ISO 8601 格式。因此无需指定格式化模式。

OffsetDateTime odt = OffsetDateTime.parse( input ) ;

关于java.time

java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .

要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 中搜索许多示例和解释。规范为 JSR 310 .

Joda-Time项目,现在在maintenance mode , 建议迁移到 java.time类。

您可以直接与您的数据库交换java.time 对象。使用 JDBC driver符合 JDBC 4.2或以后。不需要字符串,不需要 java.sql.* 类。

从哪里获得 java.time 类?

ThreeTen-Extra项目用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter , 和 more .

关于java - 如何使用时区解析日期时间,但没有 T 或纳秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54836037/

相关文章:

javascript - 无法找到要单击的元素/使用 Java 在 selenium 中发送 key

python - 如何检查日期时间是否在中午之前

Java Bukkit 事件注册多次

java - 无法解析的日期异常 从两个对象创建日期

java - 以 int 方法返回 'default' 传递给 switch

swift - 日期格式器 swift 3

C# 将 dd/MMMM/yyyy 转换为 yyyymmdd(俄语)

c# - MySQL 命令 - 日期错误

PHP 日期时间设置时区 2038

java - RED5 AXIS 相机捕捉和流媒体