如何从日期获得nanoTime?

时间:2018-06-14 10:55:15

标签: java date datetime nanotime

我想要过去24小时的nanoTime()。 long currentDate = System.nanoTime(); 如何通过减去24小时找到nanoTime? 是否可以从Date date = new Date()获得nanoTime?

1 个答案:

答案 0 :(得分:3)

System.nanoTime()目前无法使用。正如文档所说,它“与系统或挂钟时间的任何其他概念无关”。这也意味着从Date获得兼容的纳秒时间是没有意义的。

而是使用java.time.Instant为您的时间。 Instant.now()为您提供当前时间,从Java 9开始,它在大多数平台上具有非常高的分辨率(我的Mac上的微秒,我相信它只是nanoTime的好处)。然后使用例如yourInstant.minus(1, ChronoUnit.DAYS)yourInstant.minus(Duration.ofHours(24))

  

我需要在数据库中存储长值。

编辑:我希望将Instant这样存储到数据库中,或者如果不可能,那么它的字符串表示就是从{{1}获取它方法(toString类可以将此字符串解析回Instant)。因为我知道你需要保存很长的价值:这将是可能的,直到2262-04-11T23:47:16.854775807Z,接下来的200多年。如果这足够好,这里是如何从纪元作为Instant的长值获得纳秒:

Instant

使用 Instant instantNow = Instant.now(); long now = Math.addExact( Math.multiplyExact(instantNow.getEpochSecond(), 1_000_000_000), instantNow.getNano()); 课程中的addExactmultiplyExact而非普通Math+的重点是,如果出现溢出,您会收到通知也就是说,如果该值不适合*

  

是否可以将日期转换为即时,因为我们在UI [?]

上按日期功能搜索

要将日期(如2017年12月25日)转换为long,您需要确定转化的时区,因为它在地球上的任何地方都不会是同一个日期。例如:

Instant

要回答原始问题(怀疑您可以使用它),请从 ZoneId zone = ZoneId.of("Europe/Brussels"); LocalDate date = LocalDate.of(2017, Month.DECEMBER, 25); Instant asInstant = date.atStartOfDay(zone).toInstant(); 减去24小时:

System.nanoTime()