首先给出一个错误的实现:
// 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); }