Instant和LocalDateTime之间有什么区别?

我知道:

  • Instant是一种用于计算的“技术”时间戳表示(纳秒)
  • LocalDateTime相当于日期/时钟表示,包括人类的时区

最后,对于大多数应用程序用例,IMO和IMO都可以作为类型。例如:目前我正在运行一个批处理作业,其中我需要根据日期计算下一次运行,我正在努力寻找这两种类型之间的优缺点(除了Instant的纳秒精度优势和LocalDateTime的时区部分)

您能举出一些只应使用Instant或LocalDateTime的应用程序示例吗

编辑:当心LocalDateTime有关精度和时区的误读文档

tl;博士

InstantLocalDateTime是两种完全不同的动物:一种代表瞬间,另一种不代表瞬间

  • Instant表示一个时刻,即时间线上的一个特定点
  • LocalDateTime表示一天中的日期和时间。但由于缺少时区或UTC的偏移量,此类不能表示一个时刻。它代表了大约26到27小时范围内的潜在时刻,即全球所有时区的时刻。LocalDateTime值本质上是不明确的

错误推定

LocalDateTime相当于日期/时钟表示,包括人类的时区

您的陈述不正确:ALocalDateTime时区。没有时区是这门课的重点

要引用该类文档,请执行以下操作:

此类不存储或表示时区。相反,它是对日期的描述,用于生日,与挂钟上显示的当地时间相结合。如果没有诸如偏移量或时区之类的附加信息,它不能表示时间线上的某个瞬间

因此,Local…表示“未分区,无偏移”

Instant

aInstantUTC,计数自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

A时区由ZoneId

新的一天在巴黎比巴黎Montréal。因此我们需要移动时钟指针以更好地反映中午(当太阳在正上方时)对于给定区域。在西欧/非洲,从UTC线向东/向西越远,偏移量越大

时区是当地社区或地区处理调整和异常情况的一套规则。最常见的异常情况是被称为夏令时(DST)

时区具有过去规则、当前规则和为近期确定的规则的历史

这些规则的更改频率超出您的预期。请确保保留日期时间库的规则,通常是tz”数据库是最新的。随着Oracle发布a时区更新工具

指定一个正确的时区名称格式为大陆/地区,如美国/蒙特利尔非洲/卡萨布兰卡,或太平洋/奥克兰。切勿使用2-4个字母的缩写,如ESTIST,因为它们不是真正的时区,不标准化,甚至不是唯一的(!)

时区=偏移量+调整规则

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秒

LocalDateLocalTimeLocalDateTime

“本地”日期时间类,Lo

发表评论