无法在Java 11中分析本地日期时间
我有下面的代码无法在Java 11中分析本地日期时间,java,java-11,datetime-parsing,localdatetime,Java,Java 11,Datetime Parsing,Localdatetime,我有下面的代码 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"); LocalDateTime myDate = LocalDateTime.parse("2020-11-16T02:27:39.345Z", formatter); 但它在第二行中抛出了错误。不知道它为什么抱怨Z java.time.format.DateTim
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
LocalDateTime myDate = LocalDateTime.parse("2020-11-16T02:27:39.345Z", formatter);
但它在第二行中抛出了错误。不知道它为什么抱怨Z
java.time.format.DateTimeParseException: Text '2020-11-16T02:27:39.345Z' could not be parsed at index 23
at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2046)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)
at java.base/java.time.LocalDateTime.parse(LocalDateTime.java:492)
LocalDateTime
没有时区或区域偏移信息,而日期时间字符串有区域偏移。日期时间字符串末尾的字母Z
代表Zulu,即UTC
的区域偏移量。您可以直接将其解析为OffsetDateTime
或ZonedDateTime
或Instant
(即不使用自定义的DateTimeFormatter
)
演示:
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
String dateTimeString = "2020-11-16T02:27:39.345Z";
OffsetDateTime odt = OffsetDateTime.parse(dateTimeString);
System.out.println(odt);
ZonedDateTime zdt = ZonedDateTime.parse(dateTimeString);
System.out.println(zdt);
Instant instant = Instant.parse(dateTimeString);
System.out.println(instant);
}
}
2020-11-16T02:27:39.345Z
2020-11-16T02:27:39.345Z
2020-11-16T02:27:39.345Z
输出:
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
String dateTimeString = "2020-11-16T02:27:39.345Z";
OffsetDateTime odt = OffsetDateTime.parse(dateTimeString);
System.out.println(odt);
ZonedDateTime zdt = ZonedDateTime.parse(dateTimeString);
System.out.println(zdt);
Instant instant = Instant.parse(dateTimeString);
System.out.println(instant);
}
}
2020-11-16T02:27:39.345Z
2020-11-16T02:27:39.345Z
2020-11-16T02:27:39.345Z
LocalDateTime
没有时区或区域偏移信息,而日期时间字符串有区域偏移。日期时间字符串末尾的字母Z
代表Zulu,即UTC
的区域偏移量。您可以直接将其解析为OffsetDateTime
或ZonedDateTime
或Instant
(即不使用自定义的DateTimeFormatter
)
演示:
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
String dateTimeString = "2020-11-16T02:27:39.345Z";
OffsetDateTime odt = OffsetDateTime.parse(dateTimeString);
System.out.println(odt);
ZonedDateTime zdt = ZonedDateTime.parse(dateTimeString);
System.out.println(zdt);
Instant instant = Instant.parse(dateTimeString);
System.out.println(instant);
}
}
2020-11-16T02:27:39.345Z
2020-11-16T02:27:39.345Z
2020-11-16T02:27:39.345Z
输出:
import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZonedDateTime;
public class Main {
public static void main(String[] args) {
String dateTimeString = "2020-11-16T02:27:39.345Z";
OffsetDateTime odt = OffsetDateTime.parse(dateTimeString);
System.out.println(odt);
ZonedDateTime zdt = ZonedDateTime.parse(dateTimeString);
System.out.println(zdt);
Instant instant = Instant.parse(dateTimeString);
System.out.println(instant);
}
}
2020-11-16T02:27:39.345Z
2020-11-16T02:27:39.345Z
2020-11-16T02:27:39.345Z
对于该日期格式,可以使用
“yyyy-MM-dd'T'HH:MM:ss.SSSz”
或“yyy-MM-dd'T'HH:MM:ss.SSS'Z'
@ernest\k它工作得非常好。你能解释一下背后的原因吗。可能添加为答案。Z
和Z
之间的差异已记录在案'Z'
只是让解析器按照字面意思理解字母。这是否回答了您的问题。还是这个。您不需要指定格式化程序。只需使用Instant.parse(“2020-11-16T02:27:39.345Z”)代码>或OffsetDateTime.parse(“2020-11-16T02:27:39.345Z”)
。看见如果您想要本地时区中的时间,请转换为ZoneDateTime
,而不是LocalDateTime
。对于该日期格式,可以使用“yyyy-MM-dd'T'HH:MM:ss.SSSz”
或“yyyy-MM-dd'T'HH:MM:ss.SSS'Z'
,效果非常好。你能解释一下背后的原因吗。可能添加为答案。Z
和Z
之间的差异已记录在案'Z'
只是让解析器按照字面意思理解字母。这是否回答了您的问题。还是这个。您不需要指定格式化程序。只需使用Instant.parse(“2020-11-16T02:27:39.345Z”)代码>或OffsetDateTime.parse(“2020-11-16T02:27:39.345Z”)
。看见如果您想要本地时区中的时间,请转换为ZoneDateTime
,而不是LocalDateTime
。