我一直在尝试按照 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。我怎么做?
假设我想将 Instant 设置为凌晨 5:10。我怎么做?
我怀疑你想这么做。从基本意义上讲这是不可能的,因此,公式为:
这是一个很长的歌舞表演,它表明你可能实际上并不“想要”你想要的东西。也许您当前使用的任何代码都Instant可以重写以使用更合适的东西,例如ZonedDateTime或LocalDateTime.
但是,如果您必须:
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!这太荒谬了!那永远不会发生!啊,但是,你看,可能会的。
| 归档时间: |
|
| 查看次数: |
4598 次 |
| 最近记录: |