日期工具类-获取用户连续登录天数
@Slf4j
public final class DateUtil {
public static final String DEFAULT_MONTH_FORMAT = "yyyy-MM";
public static final String DEFAULT_FORMAT = "HH:mm:ss";
public static final String DEFAULT_TIME_FORMAT_24H = "yyyy-MM-dd HH:mm:ss";
public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
public static final String DEFAULT_TIME_FORMAT = "yyyy-MM-dd hh:mm:ss";
public static final long DAY_MILLIS = 24 * 60 * 60 * 1000; // 一天的毫秒数
/**
* 获取连续登录天数
*
* @param userLoginDate 日期
* @param consecutiveDays 需要连续登录的天数
* @return
*/
public static int getConsecutiveLoginDaysNum(List<Date> userLoginDate, Integer consecutiveDays) {
log.info("用户登录日期记录:{}",userLoginDate.toString());
if (CollectionUtils.isEmpty(userLoginDate)){
return 0;
}
userLoginDate.sort(Comparator.comparing(Date::getTime));
SimpleDateFormat dateFormat = new SimpleDateFormat(DEFAULT_DATE_FORMAT);
int initNum = 1;
int continuousLoginNum = 1;
for (int i = 1; i < userLoginDate.size(); i++) {
try {
Date dateAfter = dateFormat.parse(dateFormat.format(userLoginDate.get(i)));
Date dateBefore = dateFormat.parse(dateFormat.format(userLoginDate.get(i-1)));
if (Math.abs(dateAfter.getTime() - dateBefore.getTime()) == DAY_MILLIS) {
initNum++;
} else {
initNum = 1;
}
continuousLoginNum = Math.max(initNum, continuousLoginNum);
} catch (ParseException e) {
e.printStackTrace();
}
}
// 未达到要求的最长连续天数,返回目前已连续的天数
if (continuousLoginNum < consecutiveDays) {
initNum = 1;
for (int i = userLoginDate.size() - 1; i > 0; i--) {
try {
Date dateAfter = dateFormat.parse(dateFormat.format(userLoginDate.get(i)));
Date dateBefore = dateFormat.parse(dateFormat.format(userLoginDate.get(i-1)));
if (Math.abs(dateAfter.getTime() - dateBefore.getTime()) == DAY_MILLIS) {
continuousLoginNum = ++initNum;
} else {
break;
}
} catch (ParseException e) {
e.printStackTrace();
}
}
}
return continuousLoginNum;
}
}