Java 将日期和时间字符串解析为ZonedDateTime对象

Java 将日期和时间字符串解析为ZonedDateTime对象,java,java-8,zoneddatetime,java-time,Java,Java 8,Zoneddatetime,Java Time,我试图解析一个在已知时区中包含日期和时间的字符串。 字符串具有以下格式: 2019-03-07 00:05:00-05:00 我试过这个: package com.example.test; 导入java.time.ZoneId; 导入java.time.ZonedDateTime; 导入java.time.format.DateTimeFormatter; 公开课考试{ 公共静态void main(字符串[]args){ ZoneId myTimeZone=ZoneId.of(“美国/东部”

我试图解析一个在已知时区中包含日期和时间的字符串。 字符串具有以下格式:

2019-03-07 00:05:00-05:00
我试过这个:

package com.example.test;
导入java.time.ZoneId;
导入java.time.ZonedDateTime;
导入java.time.format.DateTimeFormatter;
公开课考试{
公共静态void main(字符串[]args){
ZoneId myTimeZone=ZoneId.of(“美国/东部”);
DateTimeFormatter DateTimeFormatter=模式的DateTimeFormatter.of(“YYYY-MM-dd HH:MM:ssXX”);
ZonedDateTime zdt=ZonedDateTime.parse(“2019-03-07 00:05:00-05:00”,dateTimeFormatter.withZone(myTimeZone));
系统输出打印LN(zdt);
}
}
这是引发的异常:

Exception in thread "main" java.time.format.DateTimeParseException: Text '2019-03-07 00:05:00-05:00' could not be parsed at index 19
    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
    at java.time.ZonedDateTime.parse(ZonedDateTime.java:597)
    at com.example.test.Test.main(Test.java:24)
C:\Users\user\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 0 seconds)

我正在使用Java 1.8.0¿。

使用此模式:
yyyy-MM-dd HH:MM:ssXXX

从:

偏移量X和X:。。。两个字母输出小时和分钟,不带数字 冒号,例如“+0130”。三个字母输出小时和分钟, 带有冒号,如“+01:30”

因此,如果字符串在时区内包含冒号,则应使用3个“X-E”

大写Y表示“以周为基础的年”,而不是常规的年(Y)。

tl;博士 使用偏移量,卢克 你不需要时区。您的字符串与UTC的偏移量比UTC晚五个小时。这告诉我们一个特定的时刻,时间线上的一个点

ISO 8601

用“<代码> t>代码>替换输入中间的空间,以符合ISO 8601。默认情况下,java.time类使用标准格式。因此,无需指定格式化模式

OffsetDateTime
解析为
OffsetDateTime

String input = "2019-03-07 00:05:00-05:00".replace( " " , "T" ) ;
OffsetDateTime odt = OffsetDateTime.parse( input ) ;
ZoneDateTime
如果您确实知道该值适用于特定时区,则可以应用
ZoneId
来获取
zoneDateTime

请注意,
US/Eastern
。现代方法是
大陆/地区
。也许你的意思是美国/纽约

ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;

谢谢你的回答Basil,第二个选项非常有用,我选择了第一个选项,因为它确定了如何修复格式。我也不知道美国/东方航空公司被否决了,很高兴知道这一点。
ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;