我的纪元时间戳为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。