Java计算两时间戳的间隔天数

4,037 阅读2分钟

背景

计算两个时间戳间隔的天数,如果直接把两时间戳相减,然后再整除一天的毫秒数,可能会出现计算出来的天数与常识想违背,比如昨天晚上十点到今天下午两点,时间戳上并没有达到一天,但是通常认为二者是间隔了一天的。

private static final long ONE_DAY = 24 * 60 * 60 * 1000;

public static void main(String[] args) {
   // 2021-12-18 22:30:40 时间戳为 1639837840000
   long timestampFirst = 1639837840000L;
   // 2021-12-19 14:00:50 时间戳为 1639893650000
   long timestampSecond = 1639893650000L;
   long intervalDay = (timestampSecond - timestampFirst) / ONE_DAY;
   System.out.println("两时间戳间隔的天数: " + intervalDay);
}

// 输出结果:
// 两时间戳间隔的天数: 0

如果只是单纯在计算结果的基础上加1,有时也会出现计算的结果多出1天的错误,比如昨天晚上十点到今天晚上十一点,会被计算成间隔2天。

可行的计算方式

使用Java日历类Calendar,通过时间戳创建Calendar实例对象(无需传时区参数、会使用系统默认时区),然后抹除该对象的时、分、秒、毫秒信息,接着再从该对象中获取到时间戳(此时已经不包含对计算天数不起作用的时分秒毫秒信息)作差,结果除以一天的毫秒数即可得到正确的间隔天数。

private static final long ONE_DAY = 24 * 60 * 60 * 1000;

public static void main(String[] args) {
   // 2021-12-18 22:30:40 时间戳为 1639837840000
   long timestampFirst = 1639837840000L;
   // 2021-12-19 14:00:50 时间戳为 1639893650000
   long timestampSecond = 1639893650000L;
   Calendar calendarFirst = Calendar.getInstance();
   calendarFirst.setTimeInMillis(timestampFirst);
   clearHourMinSecInfo(calendarFirst);
   Calendar calendarSecond = Calendar.getInstance();
   calendarSecond.setTimeInMillis(timestampSecond);
   clearHourMinSecInfo(calendarSecond);
   long intervalDay = (calendarSecond.getTimeInMillis() - calendarFirst.getTimeInMillis()) / ONE_DAY;
   System.out.println("两时间戳间隔的天数: " + intervalDay);
}

/**
 * 清除calendar对象的时分秒毫秒信息
 *
 * @param calendar Calendar对象
 */
private static void clearHourMinSecInfo(Calendar calendar) {
   calendar.set(Calendar.HOUR_OF_DAY, 0);
   calendar.set(Calendar.MINUTE, 0);
   calendar.set(Calendar.SECOND, 0);
   calendar.set(Calendar.MILLISECOND, 0);
}

// 输出结果:
// 两时间戳间隔的天数: 1