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

时间:2019-09-02 03:58:08

标签: java timestamp momentjs unix-timestamp days

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

上一小时:输出结果: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输出前一天和前小时结果。

2 个答案:

答案 0 :(得分:3)

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。

答案 1 :(得分:1)

我认为您可以按照以下步骤进行操作:

// 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);