在設計簽到功能時,我們往往要判斷該使用者當天是否已經進行簽到,如果有些業務需求要求記錄連續簽到的次數或者天數,這時候我們就要知道使用者最後一次簽到的時間是在前天往前還是昨天往後,下面是我自己寫的一個判斷的方法,在實際中檢驗是可用的:
/**
* 功能描述: 校驗使用者當天是否已經簽到
* 傳回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;
}