How to find day difference between 2 timestamp in java
本问题已经有最佳答案,请猛点这里访问。
我想计算2个时间戳之间有多少天的差异,但我不想考虑时差。
例如 :
1 2 | long time1 = 1546258765000 (Mon 31 December 2018 13:19:25) long time2 = 1546005915367 (Fri 28 December 2018 15:05:15) |
结果应该还有3天,3天到期......
由于时间我从这个方法得到2:
1 | TimeUnit.DAYS.convert(time1 - time2 , TimeUnit.MILLISECONDS)) |
我只需要为time1和time2设置相同的时间,然后回到时间戳并按此计算...但我不确定最好的方法是什么。
将millis转换为
1 2 3 4 5 6 7 8 9 10 11 | 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(); |
注意:正如Ole V.V所述:这仅适用于UTC。由于时间戳始终是UTC,如果您在另一个时区,它可能会返回不需要的结果。例:
在GMT + 1:
1 2 | 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))。
我相信最简单的方法可能是使用模块:
1 2 3 4 5 6 7 | 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; |
然后
1 | TimeUnit.DAYS.convert(time1 - time2 , TimeUnit.MILLISECONDS)) |
应该给你想要的结果。
使用
1 2 3 4 5 6 7 | 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有两次计算天数的方法,但结果不是你想要的:
1 | Days.daysBetween(dateTime1,dateTime2).getDays() |
将给定单位的给定持续时间转换为此单位。
从较细粒度到较粗粒度的转换会截断,因此会失去精度。例如,将
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/TimeUnit.html#convert(long,%20java.util.concurrent.TimeUnit)