我有一个划时代的时间戳1567318967 (2019年9月1日6:22:47 )。从给定的时代时间戳中,如何获得前一小时和前一天的时间,并使用Java输出划时代的结果?
也就是说。
前一小时:输出结果: 1567315367 (2019年9月1日5:22:47 )
前一天:产出结果: 1567232567 (2019年8月31日6:22:47 )
考虑到时间戳为1567318967,我尝试了以下步骤
previousDayInEpoch = moment(timestamp).substract(1, days)
previosHourInEpoch = moment(timestamp).substract(1, hour)希望使用Java输出前一天和前一小时的结果。
发布于 2019-09-02 04:23:42
java.time
这是java.time (现代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);输出是您所期望的:
前一小时: 1567315367前一天: 1567232567
时区是至关重要的
在减去一天时要注意的是,一天并不总是24小时。它有时可能是23小时,23.5小时或25小时,例如进入夏季时间(DST)和回来。ZonedDateTime知道指定时区中特定一天的长度,我们需要使用的类也是如此。因此,同样重要的是,你要填写你想要的时区,我把太平洋/夸贾林。
编辑:要使用系统时区:
ZoneId zone = ZoneId.systemDefault();这使用JVM的默认时区设置,它通常是在JVM启动时从操作系统中获取的。但是,运行在同一JVM中的任何程序在任何时候都可能更改设置,因此通常是脆弱的。自费使用(或你的用户自己的风险)。
如果你只想24小时
同样好奇的使用即时,请您更新的另一个选项的答案,这是考虑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教程:日期时间解释了如何使用java.time。
发布于 2019-09-02 04:32:20
我认为你可以这样做:
// 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);https://stackoverflow.com/questions/57751263
复制相似问题