Java 什么';Instant和LocalDateTime的区别是什么?

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

我知道:

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

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


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

一个主要区别是
Local
部分的
LocalDateTime
。如果您居住在德国并创建了一个
LocalDateTime
实例,而其他人居住在美国并在同一时刻创建了另一个实例(只要时钟设置正确),那么这些对象的值实际上是不同的。这不适用于独立于时区计算的瞬间

LocalDateTime
不带时区地存储日期和时间,但其初始值取决于时区<代码>即时不可用

此外,
LocalDateTime
提供了操作日期组件(如天、小时、月)的方法。
即时
不会

除了瞬间和瞬间的纳秒精度优势 LocalDateTime的时区部分

两个类具有相同的精度
LocalDateTime
不存储时区。仔细阅读javadocs,因为你可能会犯这样一个错误:而且。

你错了:它不存储任何时区信息,而且精度为纳秒。引用Javadoc(我的重点):

ISO-8601日历系统中没有时区的日期时间,例如2007-12-03T10:15:30

LocalDateTime是一个不可变的日期时间对象,它表示一个日期时间,通常被视为年-月-日-小时-分-秒。还可以访问其他日期和时间字段,例如年中的日期、周中的日期和周时间以纳秒精度表示。例如,值“2007年10月2日13:45.30.123456789”可以存储在LocalDateTime中

两者之间的区别在于,表示与历元(01-01-1970)的偏移,因此表示时间线上的特定时刻。在地球上两个不同的地方同时创造的两个瞬间物体将具有完全相同的值。

tl;博士
Instant
LocalDateTime
是两种完全不同的动物:一种代表瞬间,另一种不代表瞬间

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

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

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

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

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

Instant

An是中时间线上的一个时刻,是自1970 UTC第一个时刻的纪元以来的计数(基本上,请参见类文档了解详细信息)。由于您的大多数业务逻辑、数据存储和数据交换都应该使用UTC,因此这是一个经常使用的方便类

Instant instant = Instant.now() ;  // Capture the current moment in UTC.
OffsetDateTime

class类将某个时刻表示为日期和时间,上下文为UTC之前或之后的小时、分钟、秒数。偏移量(小时分秒数)由类表示

如果小时分秒数为零,则以UTC表示的时刻与

ZoneOffset

该类表示UTC之前或之后的时分秒数

ZoneOffset
仅是小时分秒数,仅此而已。分区更重要,它有一个名称和要偏移的更改历史记录。因此,使用分区总是比仅使用偏移更可取

ZoneId

A由类表示

例如,一个新的一天的破晓要早于年。因此,我们需要移动时钟指针,以便更好地反射(当太阳正上方时)给定区域。在西欧/非洲,UTC测线向东/向西越远,偏移量越大

时区是一套规则,用于处理当地社区或地区实施的调整和异常情况。最常见的异常现象是非常流行的精神错乱,称为

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

这些规则的变化比你想象的要频繁。确保日期时间库的规则(通常是一份)保持最新。在Java 8中,随着Oracle发布了一个

<
ZoneId z = ZoneId.of( “Africa/Tunis” ) ; 
ZonedDateTime zdt = ZonedDateTime.now( z ) ;  // Pass a `ZoneId` object such as `ZoneId.of( "Europe/Paris" )`. 
ZonedDateTime zdt = instant.atZone( z ) ;
String output = zdt.toString() ;                 // Standard ISO 8601 format.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( Locale.CANADA_FRENCH ) ; 
String outputFormatted = zdt.format( f ) ;
LocalDate ld = LocalDate.of( 2018 , Month.DECEMBER , 25 ) ;
LocalTime lt = LocalTime.MIN ;   // 00:00:00
LocalDateTime ldt = LocalDateTime.of( ld , lt ) ;  // Christmas morning anywhere. 
ZonedDateTime zdt = ldt.atZone( z ) ;  // Given a date, a time-of-day, and a time zone, determine a moment, a point on the timeline.
Instant instant = zdt.toInstant() ;  // Adjust from some zone to UTC. Same moment, same point on the timeline, different wall-clock time.
// Storing
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
myPreparedStatement.setObject( … , odt ) ;

// Retrieving
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Instant instant = odt.toInstant() ;
// Storing
OffsetDateTime odt = zdt.toOffsetDateTime() ;
myPreparedStatement.setObject( … , odt ) ;

// Retrieving
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = odt.atZone( z ) ;