我知道:
- Instant是一种用于计算的“技术”时间戳表示(纳秒)
- LocalDateTime相当于日期/时钟表示,包括人类的时区
最后,对于大多数应用程序用例,IMO和IMO都可以作为类型。例如:目前我正在运行一个批处理作业,其中我需要根据日期计算下一次运行,我正在努力寻找这两种类型之间的优缺点(除了Instant的纳秒精度优势和LocalDateTime的时区部分)
您能举出一些只应使用Instant或LocalDateTime的应用程序示例吗
编辑:当心LocalDateTime有关精度和时区的误读文档

tl;博士
Instant和LocalDateTime是两种完全不同的动物:一种代表瞬间,另一种不代表瞬间
Instant表示一个时刻,即时间线上的一个特定点LocalDateTime表示一天中的日期和时间。但由于缺少时区或UTC的偏移量,此类不能表示一个时刻。它代表了大约26到27小时范围内的潜在时刻,即全球所有时区的时刻。LocalDateTime值本质上是不明确的
错误推定
LocalDateTime相当于日期/时钟表示,包括人类的时区
您的陈述不正确:ALocalDateTime有无时区。没有时区是这门课的重点
要引用该类文档,请执行以下操作:
此类不存储或表示时区。相反,它是对日期的描述,用于生日,与挂钟上显示的当地时间相结合。如果没有诸如偏移量或时区之类的附加信息,它不能表示时间线上的某个瞬间
因此,Local…表示“未分区,无偏移”
Instant

aInstant是UTC,计数自1970 UTC的第一个时刻开始的纳秒(基本上,请参见class doc了解细节)。由于您的大多数业务逻辑、数据存储和数据交换都应该使用UTC,因此这是一个经常使用的方便类
Instant Instant=Instant.now();//捕获UTC中的当前时刻。
OffsetDateTime

类OffsetDateTime类将某一时刻表示为日期和时间,上下文为UTC之前或之后的若干小时分秒。偏移量(小时分秒数)由ZoneOffset类
如果小时分秒数为零,则https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/OffsetDateTime.html“rel=”noreferrer“>OffsetDateTime表示UTC中与a href=”相同的时刻https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/Instant.html“雷尔=“noreferrer”>即时
ZoneOffset

ZoneOffset类表示一个与UTC的偏移量,即UTC之前或之后的小时分秒数
ZoneOffset仅是小时分秒数,仅此而已。一个分区更为重要,它有一个名称和偏移量更改的历史记录。因此,使用分区总是比仅使用偏移量更好
ZoneId

新的一天在巴黎比巴黎Montréal。因此我们需要移动时钟指针以更好地反映中午(当太阳在正上方时)对于给定区域。在西欧/非洲,从UTC线向东/向西越远,偏移量越大
时区是当地社区或地区处理调整和异常情况的一套规则。最常见的异常情况是被称为夏令时(DST)
时区具有过去规则、当前规则和为近期确定的规则的历史
这些规则的更改频率超出您的预期。请确保保留日期时间库的规则,通常是tz”数据库是最新的。随着Oracle发布a时区更新工具
指定一个正确的时区名称格式为大陆/地区,如美国/蒙特利尔,非洲/卡萨布兰卡,或太平洋/奥克兰。切勿使用2-4个字母的缩写,如EST或IST,因为它们不是真正的时区,不标准化,甚至不是唯一的(!)
时区=偏移量+调整规则
ZoneId z=ZoneId.of(“非洲/突尼斯”);
ZoneDateTime

想想zoneDateTime概念上是一个带有指定的ZoneId的即时
ZoneDateTime=(即时+区域ID)
要捕获特定地区(时区)的人们使用的挂钟时间中的当前时刻,请执行以下操作:
ZonedDateTime zdt=ZonedDateTime.now(z);//传递一个'ZoneId'对象,例如'ZoneId.of(";Europe/Paris";)`。
几乎所有的后端、数据库、业务逻辑、数据持久性、数据交换都应该使用UTC。但是为了向用户演示,您需要调整到用户期望的时区。这是ZonedDateTime类和的目的="http://docs.oracle.com/javase/11/docs/api/java/time/format/package-summary.html“rel=”noreferrer“>用于生成这些日期时间值的字符串表示形式的格式化程序类
ZonedDateTime zdt=instant.atZone(z);
字符串输出=zdt.toString();//标准ISO 8601格式。
您可以使用DateTimeFormatter
DateTimeFormatter f=DateTimeFormatter.ofcalizeddatetime(FormatStyle.FULL).withLocale(Locale.CANADA\u FRENCH);
字符串outputFormatted=zdt.format(f);
玛迪30艾薇儿2019年23小时22分55秒
LocalDate,LocalTime,LocalDateTime



“本地”日期时间类,Lo