即
上一小时:输出结果: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输出前一天和前小时结果。
答案 0 :(得分:3)
这是现代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中运行的任何程序更改,因此通常很脆弱。使用后果自负(或用户自担风险)。
也对使用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);