从 unix 值获取前 hour/previous 天的时间戳

get previous hour/previous day timestamp from a unix value

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

在纪元中输出结果

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

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

鉴于 1567318967 的时间戳,我尝试了以下

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

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

java.time

这是 java.time 的情况之一,现代 Java 日期和时间 API,优于:

    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 知道指定时区中这一天的长度,我们需要使用的 class 也是如此。因此,在我输入 Pacific/Kwajalein.

的地方填写你想要的时区也很重要

编辑:使用系统时区:

    ZoneId zone = ZoneId.systemDefault();

这使用 JVM 的默认时区设置,通常在启动 JVM 时从 OS 中获取。但是,同一 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);

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

Link

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

我想你可以按照以下步骤进行:

// remove the 60 seconds time 60 minutes * 1000 (for millisecond)
long previousHourEpoch = epoch - (60*60*1000);

// remove the 24 hours * 60 seconds time 60 minutes * 1000 (for millisecond)
long previousDayEpoch = epoch - (24*60*60*1000);