我正在尝试解析以下格式的日期时间字符串:
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
答案 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)
•错误的班级: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 zone或offset-from-UTC的概念,因为它不表示片刻。因此,square peg, round hole。您正在舍弃有价值的信息。
相反,您应该将其解析为OffsetDateTime
。
您的输入字符串几乎采用标准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 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。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。