我想要过去 24 小时的 nanoTime((。 long currentDate=System.nanoTime((; 如何通过减去 24 小时来找到纳时间? 是否可以从日期日期 = 新日期((获取 nanoTime?
System.nanoTime()
不能用于当前时间。正如文档所说,它"与任何其他系统或挂钟时间的概念无关"。这也意味着从Date
获得兼容的纳米时间是没有意义的。
相反,使用java.time.Instant
来安排您的时间。Instant.now()
为您提供当前时间,从Java 9开始,它在大多数平台上都具有非常高的分辨率(在我的Mac上为微秒,我相信它只是nanoTime
(。然后使用例如yourInstant.minus(1, ChronoUnit.DAYS)
或yourInstant.minus(Duration.ofHours(24))
.
我需要在数据库中存储长值。
编辑:我更愿意将Instant
存储到数据库中,或者如果不可能,那么从其toString
方法获取它的字符串表示形式(Instant
类可以将此字符串解析回Instant
(。因为我知道你需要保存一个长值:这将有可能直到 2262-04-11T23:47:16.854775807Z,接下来的 200 多年。如果这足够好,以下是从Instant
获取自纪元以来的纳秒作为长值的方法:
Instant instantNow = Instant.now();
long now = Math.addExact(
Math.multiplyExact(instantNow.getEpochSecond(), 1_000_000_000),
instantNow.getNano());
使用Math
类中的addExact
和multiplyExact
而不是普通+
和*
的要点是在溢出的情况下,即值不适合long
时,您将收到通知。
是否可以将日期转换为即时,因为我们在 UI 上有按日期搜索功能[?
要将日期(如 2017 年 12 月 25 日(转换为Instant
您需要确定转换的时区,因为它在地球上任何地方都不是相同的日期。例如:
ZoneId zone = ZoneId.of("Europe/Brussels");
LocalDate date = LocalDate.of(2017, Month.DECEMBER, 25);
Instant asInstant = date.atStartOfDay(zone).toInstant();
要回答您最初的问题(怀疑您是否可以使用它(,请从System.nanoTime()
中减去 24 小时:
long nanoYesterday = System.nanoTime() - TimeUnit.DAYS.toNanos(1);