java用户每日签到
签到规则
签到周期以周为单位(最大连续签到天数为 7 天),周一为新的签到周期,所有连续签到天数重新开始计算。
表字段
以下为数据库所需的字段;
代码实现
非全部的代码;
/**
* 判断用户连续签到的天数
*/
private Integer userSignDays(List<Date> dates, Serializable userId) {
//判断今日的日期是周几?
Date date = new Date();
String weekOfDate = getWeekOfDate(date);
//判断用户今日是否签到
long count = userSignRecordDao.userSignCount(userId, date);
Integer num;
//判断今日是周几,查用户前几天连续签到的天数
switch (weekOfDate) {
case "Monday":
num = signDays(dates, 1, count);
break;
case "Tuesday":
num = signDays(dates, 2, count);
break;
case "Wednesday":
num = signDays(dates, 3, count);
break;
case "Thursday":
num = signDays(dates, 4, count);
break;
case "Friday":
num = signDays(dates, 5, count);
break;
case "Saturday":
num = signDays(dates, 6, count);
break;
case "Sunday":
num = signDays(dates, 7, count);
break;
default:
return 0;
}
return num;
}
/**
* 连续签到天数统计
*
* @param dates 用户签到天数 list
* @param weekOfDate 查询最近weekOfDate天的数据
* @return 用户连续签到的天数
*/
private Integer signDays(List<Date> dates, Integer weekOfDate, Long count) {
int n = 0;
int m = 1;
//非周一今日未签到查询用户连续签到天数
if (weekOfDate != 1 && count == 0) {
return forWeekOfDate(dates, weekOfDate - 1, m);
} else if (weekOfDate != 1 && count == 1) {
//非周一今日已签到查询用户连续签到天数
return forWeekOfDate(dates, weekOfDate, n);
}
return (weekOfDate == 1 && count == 1) ? 1 : 0;
}
/**
* for 遍历获取用户签到的天数
*
* @param dates 用户签到天数 list
* @param weekOfDate 获取用户最近几天的签到时间
* @param number 0,用户当天已经签到,从当天记录开始查询,1,用户当天没有签到,从前一个日期记录开始查询
* @return 用户连续签到的天数
*/
private Integer forWeekOfDate(List<Date> dates, Integer weekOfDate, Integer number) {
int continuousDay = 0;
if (dates.size() < weekOfDate) {
weekOfDate = dates.size();
}
for (int i = 0; i < weekOfDate; i++) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.DAY_OF_YEAR, -number++);
Date d = calendar.getTime();
boolean sign = isSameDay(dates.get(i), d);
if (sign) {
continuousDay++;
} else {
return continuousDay;
}
}
return continuousDay;
}
/**
* 判断当前日期是否是周一
*/
private static boolean currentIsMonday() {
Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY) {
return Boolean.TRUE;
}
return Boolean.FALSE;
}
/**
* 判断两个日期是否为同一天
*
* @param date1 日期
* @param date2 日期
* @return true&false
*/
private static boolean isSameDay(Date date1, Date date2) {
Calendar calDateA = Calendar.getInstance();
calDateA.setTime(date1);
Calendar calDateB = Calendar.getInstance();
calDateB.setTime(date2);
return calDateA.get(Calendar.YEAR) == calDateB.get(Calendar.YEAR)
&& calDateA.get(Calendar.MONTH) == calDateB.get(Calendar.MONTH)
&& calDateA.get(Calendar.DAY_OF_MONTH) == calDateB
.get(Calendar.DAY_OF_MONTH);
}
/**
* 判断今天是周几
*
* @param date 当前日期
* @return 今天周几
*/
private static String getWeekOfDate(Date date) {
String[] weekDays = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
if (w < 0)
w = 0;
return weekDays[w];
}