使用Java
1.8.0_51时,以下代码(摘自无法从TemporalAccessor获取OffsetDateTime)
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd").withZone(ZoneId.of("Europe/Berlin"));
OffsetDateTime offsetDateTime = ZonedDateTime.parse("20151113", formatter).toOffsetDateTime();
System.out.println(offsetDateTime.format(DateTimeFormatter.ISO_DATE));
引发异常:
java.time.format.DateTimeParseException: Text '20151113' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor: {},ISO,Europe/Berlin resolved to 2015-11-13 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)
这次我在做什么错?
您忘记设置时间了。
如果将我的答案与代码进行比较,您会注意到唯一的区别是时间信息丢失。一个ZonedDateTime
包含时间信息,并从当前的格式不处理它,实例ZonedDateTime
不能形成即可。
您还可以在包含以下内容的stacktrace中看到它
Caused by: java.time.DateTimeException: Unable to obtain LocalTime from TemporalAccessor: {},ISO,Europe/Berlin resolved to 2015-11-13 of type java.time.format.Parsed
at java.time.LocalTime.from(LocalTime.java:409)
at java.time.ZonedDateTime.from(ZonedDateTime.java:560)
... 5 more
根据您的需要,您可以使用构建一个自定义格式化程序,DateTimeFormatterBuilder
并调用parseDefaulting
来为每个时间计时字段提供默认值。如果要默认为午夜,则可以设置NANO_OF_DAY
为0。
public static void main(String[] args) {
DateTimeFormatter formatter =
new DateTimeFormatterBuilder().appendPattern("yyyyMMdd")
.parseDefaulting(ChronoField.NANO_OF_DAY, 0)
.toFormatter()
.withZone(ZoneId.of("Europe/Berlin"));
OffsetDateTime offsetDateTime = ZonedDateTime.parse("20151113", formatter).toOffsetDateTime();
System.out.println(offsetDateTime.format(DateTimeFormatter.ISO_DATE));
}
另一个可能的解决方案是将文本解析为a LocalDate
,然后ZoneDateTime
使用它构造a :
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate parsed = LocalDate.parse("20151113", formatter);
ZonedDateTime zonedDateTime = ZonedDateTime.of(parsed, LocalTime.MIDNIGHT, ZoneId.of("Europe/Berlin"));
// get OffsetDateTime similarly
}
问题内容: 我只是想将Java 8中的日期字符串转换为DateTime对象。运行以下行时: 我收到以下错误: 语法与此处建议的语法相同,但有例外。我正在使用JDK-8u25。 问题答案: 事实证明Java不接受裸露的Date值作为DateTime。使用LocalDate代替LocalDateTime解决了此问题:
我得到以下错误: 语法与这里所建议的相同,但我有一个例外。我使用的是。
我有一个以下格式的日期,我需要解析它,并转换成一个纪元时间。 关于我做错了什么有什么帮助吗?
当我这样做的时候 如何解析datetime字符串,以便将其解释为始终来自时区“欧洲/柏林”?
问题内容: 当我这样做时 我得到以下异常: 如何解析日期时间字符串,以便将其始终解释为来自“欧洲/柏林”时区? 问题答案: 问题在于,a 和a 之间存在差异。要创建一个,您需要一个区域偏移量。但是,a和a之间没有一对一的映射关系,因为它实际上取决于当前的夏时制时间。对于ZoneId像“欧洲/柏林”一样的商品,夏季有一个偏移量,而冬季有一个不同的偏移量。 在这种情况下,使用代替会更容易。在解析期间,
我有这段代码: 但我在解析时出现了这个错误: