我试图以以下格式解析日期时间字符串:
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发布于 2019-02-22 22:41:39
试试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的注释)。
发布于 2019-02-23 00:08:25
tl;dr
·错误类: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没有时区或与世界协调时相抵的概念,因为它并不代表瞬间。那么,方钉,圆孔.你在丢弃有价值的信息。
相反,您应该作为一个OffsetDateTime进行解析。
ISO 8601
您的输入字符串几乎是标准的ISO 8601格式。要完全遵守,只需将中间的空间替换为T。
String input = "2019-02-22 19:29:43+00:00".replace( " " , "T" ) ;java.time类在解析/生成字符串时默认使用ISO8601格式。因此,不需要指定格式模式。
OffsetDateTime odt = OffsetDateTime.parse( input ) ;关于java.time
http://docs.oracle.com/javase/10/docs/api/java/time/package-summary.html框架内置到Java8和更高版本中。这些类取代了麻烦的旧遗赠日期时间类,如java.util.Date、Calendar和SimpleDateFormat。
要了解更多信息,请参见http://docs.oracle.com/javase/tutorial/datetime/TOC.html。并搜索堆栈溢出以获得许多示例和解释。规范是JSR 310。
http://www.joda.org/joda-time/项目现在在维护模式中,建议迁移到java.time类。
您可以直接与数据库交换java.time对象。使用与JDBC 4.2或更高版本兼容的JDBC 4.2。不需要字符串,也不需要java.sql.*类。
在哪里获得java.time类?
三次-额外项目使用其他类扩展java.time。这个项目是将来可能加入java.time的试验场。您可以在这里找到一些有用的类,如Interval、YearWeek、YearQuarter和更多。
发布于 2021-12-18 05:44:58
解决此问题的工作代码如下
public class Demo {
public static void jodaTimeStuff(String dateString, DateTimeZone dtz) {
System.out.println(StringUtils.leftPad(dateString, 29, " ") + "\t------->\t" + DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ssZ").parseDateTime(dateString).toDateTime(dtz));
}
public static void main(String[] args) throws Exception {
jodaTimeStuff("2019-02-22 19:29:43+00:00", DateTimeZone.UTC);
jodaTimeStuff("2019-02-22 19:29:43+00:00", DateTimeZone.forTimeZone(TimeZone.getTimeZone("Asia/Kolkata")));
}}
示例代码中使用的一些依赖项(一个用于格式化,另一个用于joda:
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.13</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8</version>
</dependency>(请在祈祷中记住我)
https://stackoverflow.com/questions/54836037
复制相似问题