我想计算两个时间戳之间有多少天差,但是我不想考虑时差。
例如:
long time1 = 1546258765000 (Mon 31 December 2018 13:19:25)
long time2 = 1546005915367 (Fri 28 December 2018 15:05:15)
结果应该还有3、3天到期... 由于时间原因,我从这种方法中得到2分:
TimeUnit.DAYS.convert(time1 - time2 , TimeUnit.MILLISECONDS))
我只需要为time1和time2设置相同的时间,然后返回时间戳并像这样进行计算...但是我不确定什么是最好的方法。
答案 0 :(得分:3)
将毫秒转换为LocalDateTime
,然后计算Duration
:
LocalDateTime start = LocalDateTime
.ofInstant(Instant.ofEpochMilli(1546005915367L), ZoneId.systemDefault())
.truncatedTo(ChronoUnit.DAYS);
LocalDateTime stop = LocalDateTime
.ofInstant(Instant.ofEpochMilli(1546258765000L), ZoneId.systemDefault())
.truncatedTo(ChronoUnit.DAYS);
Duration duration = Duration.between(start, stop);
long dayDifference = duration.toDays();
答案 1 :(得分:2)
注意: 如Ole V.V 所述:这仅适用于UTC。由于时间戳始终采用UTC,因此,如果您处于其他时区,则可能会返回不希望的结果。示例:
在格林尼治标准时间+ 1:
time1 = 1546216200000L (Mon 31 December 2018 01:30:00) (31/12 00:30 on UTC)
time2 = 1545953400000L (Fri 28 December 2018 00:30:00) (27/12 11:30 on UTC)
这将导致4天的差异,因为这是UTC的差异。
要对此进行补偿,您应该补偿时差,以便时间戳显示您的当前时间,而不是UTC时间。 (例如,如果您使用的是GMT + 1,则需要为每个时间戳添加1小时(3600000 ms)。
我相信最简单的方法可能是使用模块:
final long MILLIS_PER_DAY = 1000*60*60*24;
long time1 = 1546258765000L; // (Mon 31 December 2018 13:19:25)
long time2 = 1546005915367L; // (Fri 28 December 2018 15:05:15)
// Set both times to 0:00:00
time1 -= time1 % MILLIS_PER_DAY;
time2 -= time2 % MILLIS_PER_DAY;
然后
TimeUnit.DAYS.convert(time1 - time2 , TimeUnit.MILLISECONDS))
应该给您想要的结果。
答案 2 :(得分:0)
将给定单位的给定持续时间转换为该单位。
从细粒度到粗粒度的转换会被截断,因此会失去精度。例如,将999
毫秒转换为秒将产生0
。
答案 3 :(得分:0)
使用joda-time
lib:
long time1 = 1546258765000L;
long time2 = 1546005915367L;
DateTime dateTime1 = new DateTime(time1);
DateTime dateTime2 = new DateTime(time2);
int hours = Hours.hoursBetween(dateTime2, dateTime1).getHours();
int days = hours % 24 == 0 ? hours / 24 : hours / 24 + 1;
System.out.println(days);
joda-time lib有一种方法可以计算两次之间的天数,但是结果不是您想要的:
Days.daysBetween(dateTime1,dateTime2).getDays()