获取两个日期相差的天数
有这么一个需求,需要将选择的时间与当前时间相比,算出是今天,还是明天,还是后天,还是几天之后。也就是我们所说的相差的天数。看似很简单的需求,实现起来还是有一些坑的。下面我们一起来踩坑
需求
我们暂把当前时间统一为:2018-03-27 11:50:40
当我们选择的时间为:2018-03-27 14:30:00 时,我们界面上需要显示的是:今天 14:30
当我们选择的时间为:2018-03-28 14:30:00 时,我们界面上需要显示的是:明天 14:30
当我们选择的时间为:2018-03-29 14:30:00 时,我们界面上需要显示的是:后天 14:30
当我们选择的时间为:2018-03-30 14:30:00 时,我们界面上需要显示的是:3天后 14:30
后面类似的就不再描述
具体实现
根据网上大部分的文章所写,都是采用类似以下代码来计算的,我们先来看一下此段代码
private static final String DATE_FORMAT_PATTERN = "yyyy-MM-dd HH:mm:ss";
/**
* 与当前时间相差几天
*
* @param time
* @return
*/
public static String getFewDays(String time) {
SimpleDateFormat df = new SimpleDateFormat(DATE_FORMAT_PATTERN);
try {
Date nowDate = new Date(System.currentTimeMillis());
Date date = df.parse(time);
long l = date.getTime() - nowDate.getTime();
long day = l / (24 * 60 * 60 * 1000);
if (day <= 0) {
return "今天 " + interceptTime(time);
} else if (day == 1) {
return "明天 " + interceptTime(time);
} else if (day == 2) {
return "后天 " + interceptTime(time);
} else {
return day + "天后 " + interceptTime(time);
}
} catch (ParseException e) {
e.printStackTrace();
return "";
}
}
/**
* yyyy-MM-dd HH:mm:ss 得到 HH:mm
*
* @param time
* @return
*/
private static String interceptTime(String time) {
if (time.length() == DATE_FORMAT_PATTERN.length()) {
return time.substring(11, 16);
}
return DefaultUtils.DEFAULT_INVAILD_STRING;
}
我们调用 getFewDays()
依次填入需求上面的时间,发现得出的结果是符合我们的预期的,然后我们试着填入 2018-03-28 10:30:00
,按照需求是应该显示为 明天 10:30
,但是运行完成后显示的是 今天 10:30
。
问题出现了,通过分析,我们得知两个时间相差不超过24小时的时候,算出来的 day 为 0,所以才会出现我们上面所看到的问题。问题出现了,我们就得思考怎么解决问题,下面说说我的思考
思考问题,解决问题
通过分析上面的代码,我们是用的当前时间毫秒数,和另外一个任意时间毫秒数进行相减再除以一天的毫秒数来得出相差的天数,所以只要两个时间差不足24小时,就会出现上面所说的问题。
换个思路,其实我们要比的是某个时间和当前时间是否是同一天,这样一想,我们的基准点就不该拿当前时间的毫秒数来进行比较,而是要拿当前时间所在的日期的 00:00 时刻来进行比较,这样就可以完美的解决我们不足24小时所导致的问题。思路有了,接下来就只要进行具体的实现了,下面我们直接看代码
/**
* 与当前时间相差几天
*
* @param time
* @return
*/
public static String getFewDays(String time) {
SimpleDateFormat df = new SimpleDateFormat(DATE_FORMAT_PATTERN);
try {
Date nowDate = new Date(System.currentTimeMillis());
Date date = df.parse(time);
// -----这部分是修改的内容-----
Calendar calendar = getCalendarInstance();
calendar.setTime(date);
long day1 = calendar.getTimeInMillis();
calendar.setTime(nowDate);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
long day2 = calendar.getTimeInMillis();
long l = day1 - day2;
// -----这部分是修改的内容-----
long day = l / (24 * 60 * 60 * 1000);
if (day <= 0) {
return "今天 " + interceptTime(time);
} else if (day == 1) {
return "明天 " + interceptTime(time);
} else if (day == 2) {
return "后天 " + interceptTime(time);
} else {
return day + "天后 " + interceptTime(time);
}
} catch (ParseException e) {
e.printStackTrace();
return "";
}
}
从代码可以看出,我们获取到当前时间后把当前时间设置为当天的 00:00,这样就完美的解决了我们的问题。通过这个需求所反应出的问题,解决问题更重要的是思路,只要有了思路很多问题都可以轻松解决。这篇文章就到这了,如有问题,可以在留言区进行讨论。
网友评论