将日期和时间字符串解析为 ZonedDateTime 对象
Parsing a Date and Time string into a ZonedDateTime object
我正在尝试用已知时区的日期和时间解析一个字符串。
字符串具有以下格式:
2019-03-07 00:05:00-05:00
我试过这个:
package com.example.test;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class Test {
public static void main( String[] args ) {
ZoneId myTimeZone = ZoneId.of("US/Eastern");
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ssXX");
ZonedDateTime zdt = ZonedDateTime.parse("2019-03-07 00:05:00-05:00", dateTimeFormatter.withZone(myTimeZone));
System.out.println(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.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 0 seconds)
我正在使用 Java 1.8.0_191.
使用此模式:yyyy-MM-dd HH:mm:ssXXX
来自docs:
Offset X and x: ... Two letters outputs the hour and minute, without a
colon, such as '+0130'. Three letters outputs the hour and minute,
with a colon, such as '+01:30'.
因此,如果您的字符串在时区内包含冒号,您应该使用 3 "X-es"。
大写Y表示"week-based-year",不是普通的(y)。
tl;博士
OffsetDateTime.parse(
"2019-03-07 00:05:00-05:00".replace( " " , "T" )
)
使用偏移量,卢克
您不需要时区。您的字符串带有比 UTC 晚五个小时的 UTC 偏移量。这告诉我们一个特定的时刻,时间轴上的一个点。
ISO 8601
将输入中间的 SPACE 替换为 T
以符合 ISO 8601。 java.time 类 默认使用标准格式。因此无需指定格式化模式。
OffsetDateTime
解析为 OffsetDateTime
。
String input = "2019-03-07 00:05:00-05:00".replace( " " , "T" ) ;
OffsetDateTime odt = OffsetDateTime.parse( input ) ;
ZonedDateTime
如果您确定该值适用于特定时区,则可以应用 ZoneId
以获得 ZonedDateTime
。
请注意 US/Eastern
是 deprecated as a time zone name。现代方法是 Continent/Region
。也许你的意思是 America/New_York
。
ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;
我正在尝试用已知时区的日期和时间解析一个字符串。 字符串具有以下格式:
2019-03-07 00:05:00-05:00
我试过这个:
package com.example.test;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class Test {
public static void main( String[] args ) {
ZoneId myTimeZone = ZoneId.of("US/Eastern");
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ssXX");
ZonedDateTime zdt = ZonedDateTime.parse("2019-03-07 00:05:00-05:00", dateTimeFormatter.withZone(myTimeZone));
System.out.println(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.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 0 seconds)
我正在使用 Java 1.8.0_191.
使用此模式:yyyy-MM-dd HH:mm:ssXXX
来自docs:
Offset X and x: ... Two letters outputs the hour and minute, without a colon, such as '+0130'. Three letters outputs the hour and minute, with a colon, such as '+01:30'.
因此,如果您的字符串在时区内包含冒号,您应该使用 3 "X-es"。
大写Y表示"week-based-year",不是普通的(y)。
tl;博士
OffsetDateTime.parse(
"2019-03-07 00:05:00-05:00".replace( " " , "T" )
)
使用偏移量,卢克
您不需要时区。您的字符串带有比 UTC 晚五个小时的 UTC 偏移量。这告诉我们一个特定的时刻,时间轴上的一个点。
ISO 8601
将输入中间的 SPACE 替换为 T
以符合 ISO 8601。 java.time 类 默认使用标准格式。因此无需指定格式化模式。
OffsetDateTime
解析为 OffsetDateTime
。
String input = "2019-03-07 00:05:00-05:00".replace( " " , "T" ) ;
OffsetDateTime odt = OffsetDateTime.parse( input ) ;
ZonedDateTime
如果您确定该值适用于特定时区,则可以应用 ZoneId
以获得 ZonedDateTime
。
请注意 US/Eastern
是 deprecated as a time zone name。现代方法是 Continent/Region
。也许你的意思是 America/New_York
。
ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;