我的纪元时间戳为1567318967(2019年9月1日6:22:47 AM)。从给定的纪元时间戳,如何获取前一小时和前一天,并使用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输出先前的Day和Hour的结果。

最佳答案

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小时。例如进入夏令时(DST)并返回时,有时可能是23小时,23.5小时或25小时。 ZonedDateTime知道在指定的时区中这一天的时长,因此我们需要使用该类。因此,您也必须填写我放置Pacific / Kwajalein的所需时区,这一点也很重要。

编辑:要使用系统时区:

    ZoneId zone = ZoneId.systemDefault();


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

如果您只想24小时


  也对使用Instant感到好奇,请您更新
  正在考虑24小时前考虑的其他选择的答案。


在这种情况下,我们不需要任何时区或任何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。

09-11 19:12
查看更多