Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用时区解析datetime,但不使用T或纳秒_Java_Datetime - Fatal编程技术网

Java 如何使用时区解析datetime,但不使用T或纳秒

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 =

我正在尝试以以下格式解析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 = 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。我不太明白。这很有效。谢谢。因为问题示例显示
      +00:00
      ,它应该是'xxx',而不是'xxx',因为javadoc声明:“当输出的偏移量为零时,模式字母'X'(大写)将输出'Z'”.---对于解析来说,这没有什么区别,但是如果OP也想使用这种模式格式化,它应该被修复。@Andreas谢谢你提供的信息,我根据你的评论编辑了我的答案。