如何将 Instant 设置为特定时间?

Ano*_*313 2 java datetime

我一直在尝试按照 stackoverflow 的建议将瞬间设置为特定时间,但我在这样做时遇到了麻烦。我尝试了以下方法:

Instant instant = Instant.atZone(ZoneOffset.UTC)
                        .withHour(StdIn.readInt())
                        .withMinute(StdIn.readInt())
                        .withSecond(0)
                        .toInstant();
Run Code Online (Sandbox Code Playgroud)

但是我收到错误:

错误:无法从静态上下文引用非静态方法 atZone(ZoneId)

顺便说一句,StdIn.readInt() 只是一个从输入读取数字的库。

假设我想将 Instant 设置为凌晨 5:10。我怎么做?

rzw*_*oot 5

假设我想将 Instant 设置为凌晨 5:10。我怎么做?

我怀疑你想这么做。从基本意义上讲这是不可能的,因此,公式为:

  • 随心所欲地享受瞬间。
  • 鉴于瞬间是时间中的一个时刻,而诸如分钟和天之类的人类概念不适用于此,因此您无法将瞬间的“分钟”设置为任何东西。因此,Instant 对此没有什么用处,你必须远离它。转换为知道一分钟是什么的概念...将其转换为 ZonedDateTime。
  • 获取 ZDT 并设置您想要的任何细节。
  • 将 ZDT 转换回瞬时值。

这是一个很长的歌舞表演,它表明你可能实际上并不“想要”你想要的东西。也许您当前使用的任何代码都Instant可以重写以使用更合适的东西,例如ZonedDateTimeLocalDateTime.

但是,如果您必须:

Instant original = Instant.now();
ZonedDateTime zdt = original.atZone(Zone.UTC);
// setting minutes and seconds _AT UTC_? That sounds.. bizarre.
// what in the blazes is your use case??

ZonedDateTime adjusted = zdt
  .withHour(hour).withMinute(minute).withSecond(0)
  .withNano(0) // you forgot about the nanos!
  ;

Instant out = adjusted.toInstant();
Run Code Online (Sandbox Code Playgroud)

要理解 ZDT 和 Instant 之间的区别:

想象一下您与理发师预约。该预约最好存储为 ZDT:您的预约是 2023 年 1 月 9 日上午 9 点一刻,理发师在阿姆斯特丹的 Europe/Amsterdam 区。

从此时此刻到您的约会之间的时间就是这样。当您飞往另一个时区时,它不会改变。从这个意义上说,这似乎只是一瞬间。但事实并非如此:如果荷兰颁布法令,从此荷兰将永远坚持夏令时,不再遵守夏令时,那么在法律批准的那一刻,您的预约将立即比现在提前一小时批准之前的那一刻*。

ZonedDateTimes 可以做到这一点;他们会随之调整(您必须等待下载新的时区定义,但他们会选择该定义并自动正确报告距理发师预约为止的剩余时间)。

瞬间则不然。他们甚至没有区。他们永远不会那样改变。想得更宇宙一些。

这就是区别。

*)但是,rzwitserloot!这太荒谬了!那永远不会发生!啊,但是,你看,可能会的