我的纪元时间戳为 1567318967(2019 年 9 月 1 日上午 6:22:47)。根据给定的纪元时间戳,如何使用 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输出前一天和前一小时的结果。
最佳答案
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 小时。有时可能是例如 23 小时、23.5 小时或 25 小时,例如当进入夏令时 (DST) 并返回时。 ZonedDateTime
知道指定时区中这一天的长度,我们需要使用的类也是如此。因此,填写您想要的时区(我将太平洋/夸贾林环礁放在其中)也很重要。
编辑:要使用系统时区:
ZoneId zone = ZoneId.systemDefault();
这使用 JVM 的默认时区设置,通常在 JVM 启动时从操作系统获取。然而,该设置可能随时被同一 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);
在这种情况下,输出与上面的输出相同。
链接
Oracle tutorial: Date Time解释如何使用 java.time。
关于java - 从 unix 值获取前一小时/前一天的时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57751263/