如何从日期获取纳时?



我想要过去 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类中的addExactmultiplyExact而不是普通+*的要点是在溢出的情况下,即值不适合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);

相关内容

  • 没有找到相关文章

最新更新