我正在使用ZonedDateTime和Java 8的DateTimeFormatter。当我尝试解析自己的模式时,它不会识别并抛出异常。
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解析为1970-01-01T00:00,类型为java.time.format.Parsed
答案 0 :(得分:10)
好吧,你想要创建一个总是引用时区的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
答案 1 :(得分:0)
这是将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类允许您创建带有时区的日期/时间对象。将使用默认时区。即您在计算机上建立的时区。您可以使用DateTimeFormatter类显示时区。在Java代码中,时区显示为区域偏移量,区域名称和区域ID。注意,日期时间格式化程序模式分别为“ Z”,“ z”和“ VV”。该程序还将创建一个日期/时间对象,然后使用ZoneId类的of方法添加区域ID。最后,使用ZoneOffset类的of方法将时区添加到另一个日期/时间对象。