java - 从 unix 值获取前一小时/前一天的时间戳

标签 java timestamp momentjs unix-timestamp days

我的纪元时间戳为 1567318967(2019 年 9 月 1 日上午 6:22:47)。根据给定的纪元时间戳,如何使用 Java 获取前一小时和前一天并以纪元输出结果?

前一小时:输出结果:1567315367(2019年9月1日5:22:47 AM)

前一天:输出结果:1567232567(2019年8月31日6:22:47 AM)

给定时间戳 1567318967 ,我尝试了以下操作

       previousDayInEpoch = moment(timestamp).substract(1, days)
       previosHourInEpoch = moment(timestamp).substract(1, hour)

想使用Java输出前一天和前一小时的结果。

最佳答案

java.time

这是现代 Java 日期和时间 API java.time 表现出色的情况之一:

    ZoneId zone = ZoneId.of("Pacific/Kwajalein");
    long originalTimestamp = 1_567_318_967L;
    ZonedDateTime dateTime = Instant.ofEpochSecond(originalTimestamp).atZone(zone);

    long anHourLess = dateTime.minusHours(1).toInstant().getEpochSecond();
    System.out.println("previous hour: " + anHourLess);

    long aDayLess = dateTime.minusDays(1).toInstant().getEpochSecond();
    System.out.println("previous day: " + aDayLess);

输出是您所期望的:

previous hour: 1567315367
previous day: 1567232567

时区至关重要

减去一天时需要注意的重要一点是,一天并不总是 24 小时。有时可能是例如 23 小时、23.5 小时或 25 小时,例如当进入夏令时 (DST) 并返回时。 ZonedDateTime 知道指定时区中这一天的长度,我们需要使用的类也是如此。因此,填写您想要的时区(我将太平洋/夸贾林环礁放在其中)也很重要。

编辑:要使用系统时区:

    ZoneId zone = ZoneId.systemDefault();

这使用 JVM 的默认时区设置,通常在 JVM 启动时从操作系统获取。然而,该设置可能随时被同一 JVM 中运行的任何程序更改,因此通常很脆弱。使用风险由您自行承担(或您的用户自行承担风险)。

如果你只想要 24 小时

Also curious about using the Instant, would you please update the answer for the other option which is considering 24 hours ago.

在这种情况下,我们不需要任何时区或任何 ZonedDateTime。要从 Instant 中减去一小时或一天(始终为 24 小时),您需要知道如何操作。事情是这样的:

    Instant originalInstant = Instant.ofEpochSecond(originalTimestamp);

    long anHourLess = originalInstant.minus(1, ChronoUnit.HOURS).getEpochSecond();
    System.out.println("previous hour: " + anHourLess);

    long aDayLess = originalInstant.minus(1, ChronoUnit.DAYS).getEpochSecond();
    System.out.println("previous day: " + aDayLess);

在这种情况下,输出与上面的输出相同。

链接

Oracle tutorial: Date Time解释如何使用 java.time。

关于java - 从 unix 值获取前一小时/前一天的时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57751263/

相关文章:

jenkins - 什么会导致控制台 View 和 blueocean View 之间的时间戳不同?

javascript - moment-timezone.js 转换错误

java - 从匿名类内部访问变量

java - 是否可以将 LLVM 字节码转换为 Java 字节码?

java - 如何在 surfaceview 中将 Android 相机更改为纵向?

javascript - 输入字段中的angularjs时间戳到日期时间格式字符串

postgresql - 在 PostgreSQL 查询中返回超过 24 小时

momentjs - 如何根据 Moment.js 中的周数和年份获取一周的第一个日期?

javascript - 为什么这会返回一个带有 moment js 的无效日期

java - 如何使用EL + JSTL将任意对象转换为String? (调用 toString())