首先給出一個錯誤的實現:
// time1, time2 分別是 UTC 毫秒間隔 public static boolean getDayInterval(long time1, long time2) { long base = 24*3600*1000L; long day1 = time1/base + 1; long day2 = time2/base + 1; return (day1 - day2); }
上面的代碼之所以錯誤,因為涉及到時區了,中國大陸的時區是 UTC + 8。
涉及到時區操作,使用 Calendar 類:
public static boolean isSameDay(long time1, long time2) { Calendar calendar1 = Calendar.getInstance(); calendar1.setTimeInMillis(time1); Calendar calendar2 = Calendar.getInstance(); calendar1.setTimeInMillis(time2); return calendar1.get(Calendar.DAY_OF_MONTH) == calendar2.get(Calendar.DAY_OF_MONTH); }
上面的代碼可以判斷兩個時間,在本地時區中是不是同一天,但是怎樣計算天數間隔呢?我們需要在 UTC 時間的基礎上加上那 8 個小時,得到本地時區的毫秒數,然后再計算間隔天數,正確代碼如下:
public static long getDayInterval(long time1, long time2) { // 獲得當前時區 TimeZone tz = TimeZone.getDefault(); // UTC毫秒加上這個偏移值,得到本地時區的時間 long delta = tz.getRawOffset(); long base = 24*3600*1000L; long day1 = (time1+delta)/base + 1L; long day2 = (time2+delta)/base + 1L; System.out.println(new Date(time1)); System.out.println(new Date(time2)); System.out.println(day1); System.out.println(day2); return (day1-day2); }