java timestamp时间差_关于datetime:如何在java中找到2个时间戳之间的日差
本問題已經有最佳答案,請猛點這里訪問。
我想計算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。
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/TimeUnit.html#convert(long,%20java.util.concurrent.TimeUnit)
我相信他知道這一點,至少在他知道他必須將兩個日期設置為同一時間的意義上。
總結
以上是生活随笔為你收集整理的java timestamp时间差_关于datetime:如何在java中找到2个时间戳之间的日差的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bat查看java进程 过滤_通过查找.
- 下一篇: java写一个音乐播放器源码_求一个JA