java实现用户每日签到功能

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];
    }
  • 9
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值