Unable to obtain ZonedDateTime from TemporalAccessor: {},ISO resolved to xxx of type...

本文主要是介绍Unable to obtain ZonedDateTime from TemporalAccessor: {},ISO resolved to xxx of type...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

环境

java:1.8
Intellij IDEA:2019.2.4

前言

想把字符串格式的时间转为OffsetDateTime时,报了以下错误:

Unable to obtain ZonedDateTime from TemporalAccessor: {},
ISO resolved to 2019-10-13T00:00 of type java.time.format.Parsed

代码

看看我的解析代码:

public static void main(String[] args) {String value = "2019-10-13 00:00:00";String DATE_TIME_SECOND_STRING = "yyyy-MM-dd HH:mm:ss";DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DATE_TIME_SECOND_STRING);OffsetDateTime offsetDateTime = ZonedDateTime.parse(value, dateTimeFormatter).toOffsetDateTime();System.out.println(offsetDateTime);
}

为什么会报错呢?

我们要知道,世界完整的时间,只有三种表示方式:
① Instant
② OffsetDateTime
③ ZoneDateTime

其中Instant给机器看的,OffsetDateTime是以时区偏移量来表示世界完整时间;
ZoneDateTime是通过指定时区的方式来表示世界完整时间.

回到我上面的例子:
字符串:

String value = "2019-10-10 00:00:00";

是个时间字符串,但是呢,中国人看这个时间和美国人看这个时间是不一样的,因为中国和美国有时差,具体点,就是上面这段时间字符串,没有指定时区。

所以在用上面的解析代码时,就报错了。

解决办法也很简单,就是加上时区就行了。

方法一

将上面的代码补上时区:

 DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DATE_TIME_SECOND_STRING)
.withZone(ZoneId.systemDefault());

方法二

DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern(DATE_TIME_SECOND_STRING)
.parseDefaulting(ChronoField.NANO_OF_DAY,0).toFormatter().withZone(ZoneId.systemDefault());

这段代码和方法一类似,就是多了.parseDefaulting(ChronoField.NANO_OF_DAY,0)。这个意思是,从纳秒开始,没有指定的值,用0填充。

方法三

上面的时间字符串,在java8中对应的类是LocalDateTime,它和世界完整时间的差距就是缺一个时区。
思路就是:
① 我们先转成LocalDateTime
② 再补上时区

String value = "2019-10-13 00:00:00";
String DATE_TIME_SECOND_STRING = "yyyy-MM-dd HH:mm:ss";
// 先将时间字符串转成LocalDateTime
LocalDateTime parse = LocalDateTime.parse(value, dateTimeFormatter);
// 再补上时区得到完整世界时间
OffsetDateTime offsetDateTime1 = ZonedDateTime.of(parse, ZoneId.systemDefault()).toOffsetDateTime();
System.out.println(offsetDateTime1);

结果:

2019-10-13T00:00+08:00

总结

这次的异常,再次让我对java8的时间有了更深的认识。

以前java7中的时间,对应是LocalDate或者LocalDateTime这两个类。
java8引入了时区的概念后,就有了世界完整时间的表示:
Instant
OffsetDateTime
ZoneDateTime

其中Instant给机器看的;
OffsetDateTime是以时区偏移量来表示世界完整时间;比如我们中国东8区,
就是+8(偏移量)
ZoneDateTime是通过指定时区的方式来表示世界完整时间。
比如:ZoneId.of("Asia/Shanghai")

时差可以参考:
https://www.zeitverschiebung.net/cn/city/1816670

参考地址:

Java8学习笔记:LocalDateTime、Instant 和 OffsetDateTime 相互转换

http://www.it1352.com/616373.html

这篇关于Unable to obtain ZonedDateTime from TemporalAccessor: {},ISO resolved to xxx of type...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1112127

相关文章

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla

Unable to instantiate Action, goodsTypeAction, defined for 'goodsType_findAdvanced' in namespace '/

报错: Unable to instantiate Action, goodsTypeAction,  defined for 'goodsType_findAdvanced' in namespace '/'goodsTypeAction......... Caused by: java.lang.ClassNotFoundException: goodsTypeAction.......

Caused by: org.hibernate.MappingException: Could not determine type for: org.cgh.ssh.pojo.GoodsType,

MappingException:这个主要是类映射上的异常,Could not determine type for: org.cgh.ssh.pojo.GoodsType,这句话表示GoodsType这个类没有被映射到

Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.B

一个bug日志 FATAL EXCEPTION: main03-25 14:24:07.724: E/AndroidRuntime(4135): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.syyx.jingubang.ky/com.anguotech.android.activity.Init

The import com.google cannot be resolved

The import com.google cannot be resolved,报错: 第一感觉就是缺少jar包,因为项目用maven管理,所以在pom.xml中添加: <dependency>  <groupId>com.google.code.gson</groupId>  <artifactId>gson</artifactId>  <version>2.3.1</ver

DoIP-ISO 13400-1 道路车辆-基于互联网协议的诊断通信(DoIP)-第 1 部分:一般信息和用例定义 (1/2)

如下内容基于2011版本的 ISO 13400开展,内容较多,拆分为2篇,此篇为 1/2。 前言 ISO(国际标准化组织)是一个全球范围内的国际标准机构联合体(ISO 成员机构)。国际标准的制备工作通常通过 ISO 技术委员会进行。每个相关成员机构都有权在已建立的技术委员会中代表其利益。与 ISO 保持联系的国际组织、政府和非政府组织也参与这项工作。ISO 与国际电工委员会(IEC)在所有电气

clang: error: no such file or directory: '/Users/bigxin/Desktop/not file xxx

这样的问题,解决方法有以下几种: 第一:一般多人开发的时候会出现文件缺失的问题,遇到这个问题就根据提示找到对应的地址,然后会发现这个文件名字是红色的把红色的文件删除,然后重新addfile,然后把缺失的文件拷贝过来就可以了。。第二:如果第一种方法不行的话,可以移步到 TARGETS —-> Build Phases ——> Compile Sources(编译源) 里面来找,看有没有失效的文件

unable to access android sdk add-on list解决办法

mac环境,由于不小心删掉了sdk文件夹的内容,拷贝别人的文件内容过来后,发现sdkmanager不见了。 慌乱中重装了Android Studio。 打开app后发现如下提示:unable to access android sdk add-on list 解决办法: 在 Android Studio 安装目录 bin/idea.properties 文件最后追加一句 disabl

兔子--The method setLatestEventInfo(Context, CharSequence, CharSequence, PendingIntent) from the type

notification.setLatestEventInfo(context, title, message, pendingIntent);     不建议使用 低于API Level 11版本,也就是Android 2.3.3以下的系统中,setLatestEventInfo()函数是唯一的实现方法。  Intent  intent = new Intent(