我的纪元时间戳为 1567318967(2019 年 9 月 1 日上午 6:22:47)。从给定的纪元时间戳,如何使用 Java 获取前一小时和前一天并在纪元中输出结果?
IE
前一小时:输出结果: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 日期和时间 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 中运行的任何程序都可能随时更改该设置,因此通常很脆弱。使用风险自负(或用户自担风险)。
也对使用 Instant 感到好奇,请您更新 24 小时前正在考虑的其他选项的答案。
在这种情况下,我们不需要任何时区或任何ZonedDateTime
. 要从 中减去一小时或一天(总是 24 小时)Instant
,您需要知道如何做。它是这样的:
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 教程:解释如何使用 java.time 的日期时间。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句