本问题已经有最佳答案,请猛点这里访问。
我想计算2个时间戳之间有多少天的差异,但我不想考虑时差。
例如 :
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设置相同的时间,然后回到时间戳并按此计算...但我不确定最好的方法是什么。
你在哪个时区? 好像你在UTC偏移+01:00? 您需要确定一个时区,以便将long值转换为日期。
将millis转换为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();
非常感谢您的帮助!
此答案中的代码中的truncatedTo调用对于获得精确结果至关重要(另一种方法是转换为LocalDate,因为这也会截断)。
注意:正如Ole V.V所述:这仅适用于UTC。由于时间戳始终是UTC,如果您在另一个时区,它可能会返回不需要的结果。例:
在GMT + 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))
应该给你想要的结果。
time1%MILLIS_PER_DAY始终为0
不,不是。我只是测试它以防万一我输入错误的东西,但它完美无缺
你完全正确,这是我的错,非常感谢你的帮助
这将给出UTC的预期结果。在其他时区,它有时会,有时结果将是一天太多或太少。该算法非常适合我的口味。我宁愿把更多的工作留给库方法。
@ OleV.V。实际上它会将两个时间戳设置为同一时间,因此时区并不重要,它总是可以正常工作(因为我们不关心日期,只关注差异)。我通常尽量避免使用库方法,这是一个简单的任务,我不喜欢我的程序太重
我在欧洲/哥本哈根时区。我用time1 = 1546216200000L(2018年12月31日01:30:00)和time2 = 1545953400000L(2018年12月28日00:30:00)尝试了你的代码。预期差异:3天。印刷差异:4天。您的代码在UTC之外提供了错误的结果
@ OleV.V。你是对的,我没有真正考虑过这个案子,谢谢你指出来。编辑答案澄清这一点,并添加了一个解决方案
使用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()
将给定单位的给定持续时间转换为此单位。
从较细粒度到较粗粒度的转换会截断,因此会失去精度。例如,将999毫秒转换为秒会导致0。
我相信他知道这一点,至少在他知道他必须将两个日期设置为同一时间的意义上。