Java8- DateTimeFormatter 无法识别格式的 ZonedDateTime
Java8- ZonedDateTime with DateTimeFormatter not recognizing the format
我正在使用带 DateTimeFormatter 的 ZonedDateTime Java 8。当我尝试解析我自己的模式时,它无法识别并抛出异常。
String oraceDt = "1970-01-01 00:00:00.0";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
ZonedDateTime dt = ZonedDateTime.parse(oraceDt, formatter);
Exception in thread "main" java.time.format.DateTimeParseException: Text '1970-01-01 00:00:00.0' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor: {},ISO resolved to 1970-01-01T00:00 of type java.time.format.Parsed
at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1918)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1853)
at java.time.ZonedDateTime.parse(ZonedDateTime.java:597)
at com.timezone.Java8DsteTimes.testZonedDateTime(Java8DsteTimes.java:31)
at com.timezone.Java8DsteTimes.main(Java8DsteTimes.java:11)
原因:java.time.DateTimeException:无法从 TemporalAccessor 获取 ZonedDateTime:{},ISO 解析为 java.time.format.Parsed
类型的 1970-01-01T00:00
好吧,您想创建一个始终引用时区的 ZonedDateTime
,但您的输入不包含此类信息,并且如果输入是缺少一个区域。您的问题有两种解决方案:
指示您的解析器使用时区(此处以系统 tz 为例):
String oraceDt = "1970-01-01 00:00:00.0";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
ZonedDateTime zdt =
ZonedDateTime.parse(oraceDt, formatter.withZone(ZoneId.systemDefault()));
System.out.println(zdt); // in my default zone => 1970-01-01T00:00+01:00[Europe/Berlin]
使用另一种不需要时区的结果类型(此处LocalDateTime
):
String oraceDt = "1970-01-01 00:00:00.0";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
LocalDateTime ldt = LocalDateTime.parse(oraceDt, formatter);
System.out.println(ldt); // 1970-01-01T00:00
这是一个使用 ZonedDateTime 和 Java 8 的 DateTimeFormatter 的小例子。
public String currentDateTime() {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("EEEE y-MM-d MMMM HH:m:s z Z'['VV']' 'Day:'D");
return ZonedDateTime.now(ZoneId.of("Europe/Lisbon")).format(dateTimeFormatter);
}
ZonedDateTime class 允许您创建带有时区的 date/time 对象。将使用默认时区;即,您在计算机上建立的时区。您可以使用 DateTimeFormatter class 来显示时区。在 Java 代码中,时区显示为时区偏移量、时区名称和时区 ID。请注意,日期时间格式化程序模式分别为 "Z"、"z" 和 "VV"。该程序还创建一个 date/time 对象,然后使用 ZoneId class 的方法添加区域 ID。最后,使用 ZoneOffset class.
的 of 方法将时区添加到另一个 date/time 对象
我正在使用带 DateTimeFormatter 的 ZonedDateTime Java 8。当我尝试解析我自己的模式时,它无法识别并抛出异常。
String oraceDt = "1970-01-01 00:00:00.0";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S");
ZonedDateTime dt = ZonedDateTime.parse(oraceDt, formatter);
Exception in thread "main" java.time.format.DateTimeParseException: Text '1970-01-01 00:00:00.0' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor: {},ISO resolved to 1970-01-01T00:00 of type java.time.format.Parsed
at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1918)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1853)
at java.time.ZonedDateTime.parse(ZonedDateTime.java:597)
at com.timezone.Java8DsteTimes.testZonedDateTime(Java8DsteTimes.java:31)
at com.timezone.Java8DsteTimes.main(Java8DsteTimes.java:11)
原因:java.time.DateTimeException:无法从 TemporalAccessor 获取 ZonedDateTime:{},ISO 解析为 java.time.format.Parsed
类型的 1970-01-01T00:00好吧,您想创建一个始终引用时区的 ZonedDateTime
,但您的输入不包含此类信息,并且如果输入是缺少一个区域。您的问题有两种解决方案:
指示您的解析器使用时区(此处以系统 tz 为例):
String oraceDt = "1970-01-01 00:00:00.0"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S"); ZonedDateTime zdt = ZonedDateTime.parse(oraceDt, formatter.withZone(ZoneId.systemDefault())); System.out.println(zdt); // in my default zone => 1970-01-01T00:00+01:00[Europe/Berlin]
使用另一种不需要时区的结果类型(此处
LocalDateTime
):String oraceDt = "1970-01-01 00:00:00.0"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S"); LocalDateTime ldt = LocalDateTime.parse(oraceDt, formatter); System.out.println(ldt); // 1970-01-01T00:00
这是一个使用 ZonedDateTime 和 Java 8 的 DateTimeFormatter 的小例子。
public String currentDateTime() {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("EEEE y-MM-d MMMM HH:m:s z Z'['VV']' 'Day:'D");
return ZonedDateTime.now(ZoneId.of("Europe/Lisbon")).format(dateTimeFormatter);
}
ZonedDateTime class 允许您创建带有时区的 date/time 对象。将使用默认时区;即,您在计算机上建立的时区。您可以使用 DateTimeFormatter class 来显示时区。在 Java 代码中,时区显示为时区偏移量、时区名称和时区 ID。请注意,日期时间格式化程序模式分别为 "Z"、"z" 和 "VV"。该程序还创建一个 date/time 对象,然后使用 ZoneId class 的方法添加区域 ID。最后,使用 ZoneOffset class.
的 of 方法将时区添加到另一个 date/time 对象