【问题标题】:how to convert microseconds to LocalDateTime in java 8 [duplicate]如何在java 8中将微秒转换为LocalDateTime [重复]
【发布时间】:2021-08-31 04:07:34
【问题描述】:

我可以像这样将 19 位 unix 时间戳转换为 LocalDateTime

Instant instant =
                    Instant.ofEpochSecond(
                            TimeUnit.NANOSECONDS.toSeconds(timestamp),
                            (timestamp % 1_000_000_000L));
            return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());

对于 16 位(微秒)时间戳,我如何做到这一点? 如何从 LocalDateTime 转换回 19 / 16 位时间戳?

谢谢

【问题讨论】:

  • 你看过文档了吗?有一个LocalDateTime.toInstant(ZoneOffset),您可以使用它来转换回Instant,然后在那个瞬间调用toEpochMilli()getNanon()
  • 这就像在问“我可以将 5.2 舍入到 5.0,但是如何将 5.0 转换为 5.2” 如果您没有将丢弃的值存储在某个变量中并想出一些解决方案,则无法添加精度将该精度添加到转换后的值。
  • 首选ZonedDatteTime 作为您自己(本地)时区的日期和时间。此外,通过转换为LocalDateTime,您会丢弃信息,这将使相反的转换变得不可能。

标签: java java-8 java-time


【解决方案1】:

您可以使用Instant.ofEpochMilli 以从时间戳中获取时间(以毫秒为单位),然后使用Instant#plusNanos 添加微秒。

看起来像这样:

Instant instant = Instant.ofEpochMillis(timestamp/1_000).plusNanos(timestamp%1_000);
return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());

timestamp/1_000 以毫秒为单位获取时间,截断微秒,plusNanos(timestamp%1_000) 添加微秒部分并返回一个新的Instant

然后可以使用具有正确微秒时间的 Instant 来获取 LocalDateTime

要复制回来,您可以将其转换为 s ZonedDateTime,然后再转换为 Instant,如 here 所述:

ZonedDateTime zonedTimestamp=yourLocalDateTime.atZone(ZoneId.systemDefault());
Instant convertedInstant=zonedTimestamp.toInstant();
long recreatedTimeMicros=convertedInstant.toEpochMillis()*1_000+(convertedInstant.getNano()/1_000)%1_000;

这会将LocalDateTime 转换为具有默认时区(您在另一个方向使用)的ZonedDateTime,并获取纪元毫秒并将纳秒添加到它。

请注意,getNanos() 获取自上一秒以来的纳秒数。毫秒需要乘以 1000,以便它以微秒为单位,出于同样的原因,纳秒除以 1000。此外,还需要模运算,这样您就不会多次计算毫秒数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-24
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    相关资源
    最近更新 更多