如何使用时区解析日期时间,但不解析T或纳秒

时间:2019-02-22 22:25:42

标签: 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

2 个答案:

答案 0 :(得分:3)

尝试yyyy-MM-dd HH:mm:ssXXX。这应该可以解决您的问题。

  

偏移X和x:

     

一个字母仅输出小时,例如“ +01”,除非分钟非零,在这种情况下,分钟也会输出,例如“ +0130”。

     

两个字母输出小时和分钟,不带冒号,例如'+0130'。

     

三个字母输出小时和分钟,并带有冒号,例如'+01:30'。

     

四个字母输出小时和分钟,可选秒,不带冒号,例如'+013015'。

     

五个字母输出时,分和可选秒,并带有冒号,例如'+01:30:15'。

     

六个或更多字母会引发IllegalArgumentException。

在表格下方的描述中:https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

编辑:

如果要使用该格式设置日期格式并希望使用相同的输出字符串,则应改用yyyy-MM-dd HH:mm:ssxxx(请参见下面的Andreas评论)。

答案 1 :(得分:3)

tl; dr

错误的班级OffsetDateTime,而不是LocalDateTime

T替换SPACE ,以默认使用标准格式。

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 zoneoffset-from-UTC的概念,因为它表示片刻。因此,square peg, round hole。您正在舍弃有价值的信息。

相反,您应该将其解析为OffsetDateTime

ISO 8601

您的输入字符串几乎采用标准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

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

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

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

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

在哪里获取java.time类?

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