在设计签到功能时,我们往往要判断该用户当天是否已经进行签到,如果有些业务需求要求记录连续签到的次数或者天数,这时候我们就要知道用户最后一次签到的时间是在前天往前还是昨天往后,下面是我自己写的一个判断的方法,在实际中检验是可用的:
/**
* 功能描述: 校验用户当天是否已经签到
* 返回1代表已签到,0代表未签到且处于连续签到状态 2代表未签到但处于断续签到状态
*
* @param date
* @return int
* @author Martin
* @date 2018/11/5
* @version V1.0
*/
public int checkAllotSigin(Date date) throws Exception {
int result = 0;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//将Date类型转换成String类型
String time = sdf.format(date);
log.info("转换后的时间:" + time);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
LocalDateTime localTime = LocalDateTime.parse(time, dtf);
log.info("当前的localTime:" + localTime);
LocalDateTime startTime = LocalDate.now().atTime(0, 0, 0);
log.info("startTime:" + startTime);
LocalDateTime endTime = LocalDate.now().atTime(23, 59, 59);
log.info("endTime:" + endTime);
//如果小于今天的开始日期
if (localTime.isBefore(startTime)) {
/**判断是否小于昨天,小于昨天证明签到不连续,签到记录表签到连续次数设置为0*/
Date newTime = new Date();
//将下面的 理解成 yyyy-MM-dd 00:00:00 更好理解点
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String todayStr = format.format(newTime);
Date today = format.parse(todayStr);
//昨天 86400000=24*60*60*1000 一天 大于昨天 至少为前天
if ((today.getTime() - date.getTime()) > 86400000) {
result = 2;
log.info("小于今天的开始日期,至少为前天的时间,连续签到终止");
} else {
result = 0;
log.info("小于今天的开始日期,最后一次签到是昨天,连续签到未终止");
}
}
//如果大于今天的开始日期,小于今天的结束日期
if (localTime.isAfter(startTime) && localTime.isBefore(endTime)) {
log.info("大于今天的开始日期,小于今天的结束日期");
result = 1;
}
//如果大于今天的结束日期
if (localTime.isAfter(endTime)) {
log.info("大于今天的结束日期");
result = 1;
}
return result;
}