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