java实现连续签到(打卡)天数

业务上需要开发一个获取连续签到(打卡)天数的功能,修修改改多次后发现了规律,可以减少代码量,使程序更简洁明了。

核心是getContinuousSignInDay方法的逻辑,每次用当前时间去比较,规律是比较的天数是递增的(连续签到的情况下)。

这份代码脱去了业务上的逻辑,只有签到的功能demo

import lombok.Data;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @Description TODO
 * @Author fangyunhe
 * @Date 2019/8/15 17:41
 * Version 1.0
 **/
public class SignInTest {

    @Data
    static
    class SignIn{
        private Date signInDay;

        public SignIn(){

        }

        public SignIn(String day) throws ParseException {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            signInDay = sdf.parse(day);
        }
    }

    public static void main(String[] args) throws Exception{
        List<SignIn> signInList = new ArrayList<>();
        signInList.add(new SignIn("2019-08-15"));
        signInList.add(new SignIn("2019-08-14"));
        //signInList.add(new SignIn("2019-08-13"));
        signInList.add(new SignIn("2019-08-12"));
        signInList.add(new SignIn("2019-08-11"));
        int continuousSignInDay = getContinuousSignInDay(signInList);
        System.out.println("连续签到日期:"+ continuousSignInDay);
    }

    /**
     * 连续签到天数
     *
     * @return int
     * @Author fangyunhe
     * @Date 2019-08-15 17:16:01
     * @Param
     **/
    private static int getContinuousSignInDay(List<SignIn> signInList) {
        //continuousDay 连续签到数
        int continuousDay = 1;
        boolean todaySignIn = false;
        Date today = new Date();
        for (int i = 0; i < signInList.size(); i++) {
            SignIn signIn = signInList.get(i);
            int intervalDay = distanceDay(today, signIn.getSignInDay());
            //当天签到
            if (intervalDay == 0 && i == 0) {
                todaySignIn = true;
            }
            else if (intervalDay == continuousDay) {
                continuousDay++;
            }else {
                //不连续,终止判断
                break;
            }
        }
        if (!todaySignIn) {
            continuousDay--;
        }
        return continuousDay;
    }

    /**
     * 两个日期对比间隔天数
     *
     * @param smallDay
     * @return boolean
     * @Author fangyunhe
     * @Date 2019-08-13 18:42:41
     * @Param largeDay
     **/
    private static int distanceDay(Date largeDay, Date smallDay) {
        int day = (int) ((largeDay.getTime() - smallDay.getTime()) / (1000 * 60 * 60 * 24));
        return day;
    }
}

 

  • 9
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
你好!针对你的问题,我可以提供以下思路: 1. 首先,需要定义一个签到记录表,记录用户的签到情况。该表可以包括用户ID、签到日期、签到状态等字段。 2. 在用户签到时,需要进行如下操作: a. 判断用户当天是否已经签到。 b. 如果当天已经签到,则返回签到失败。 c. 如果当天没有签到,则将签到状态更新为已签到。 d. 判断用户是否连续签到,如果是,则将用户的连续签到天数加1,否则连续签到天数清零。 3. 在查询用户签到信息时,需要返回用户当月的签到情况,以及用户的连续签到天数。 下面是一个简单的 Java 实现: ``` import java.time.LocalDate; import java.util.HashMap; import java.util.Map; public class SignInSystem { // 签到记录表 private Map<String, Map<LocalDate, Boolean>> records = new HashMap<>(); // 用户签到 public boolean signIn(String userId) { // 获取当前日期 LocalDate today = LocalDate.now(); // 获取用户签到记录 Map<LocalDate, Boolean> userRecords = records.getOrDefault(userId, new HashMap<>()); // 判断用户是否已经签到 if (userRecords.containsKey(today) && userRecords.get(today)) { return false; } // 更新用户签到记录 userRecords.put(today, true); records.put(userId, userRecords); // 计算连续签到天数 int consecutiveDays = 0; for (LocalDate date = today.minusDays(6); date.isBefore(today.plusDays(1)); date = date.plusDays(1)) { if (userRecords.containsKey(date) && userRecords.get(date)) { consecutiveDays++; } else { consecutiveDays = 0; } } // 返回签到结果 return true; } // 查询用户签到情况 public Map<LocalDate, Boolean> getSignInRecords(String userId) { return records.getOrDefault(userId, new HashMap<>()); } // 查询用户连续签到天数 public int getConsecutiveDays(String userId) { // 获取当前日期 LocalDate today = LocalDate.now(); // 获取用户签到记录 Map<LocalDate, Boolean> userRecords = records.getOrDefault(userId, new HashMap<>()); // 计算连续签到天数 int consecutiveDays = 0; for (LocalDate date = today.minusDays(6); date.isBefore(today.plusDays(1)); date = date.plusDays(1)) { if (userRecords.containsKey(date) && userRecords.get(date)) { consecutiveDays++; } else { consecutiveDays = 0; } } // 返回连续签到天数 return consecutiveDays; } } ``` 使用示例: ``` public static void main(String[] args) { SignInSystem signInSystem = new SignInSystem(); // 用户A签到 signInSystem.signIn("A"); // 查询用户A的签到情况 Map<LocalDate, Boolean> recordsA = signInSystem.getSignInRecords("A"); System.out.println(recordsA); // 查询用户A的连续签到天数 int consecutiveDaysA = signInSystem.getConsecutiveDays("A"); System.out.println(consecutiveDaysA); // 用户A连续签到7天 signInSystem.signIn("A"); signInSystem.signIn("A"); signInSystem.signIn("A"); signInSystem.signIn("A"); signInSystem.signIn("A"); signInSystem.signIn("A"); // 查询用户A的连续签到天数 consecutiveDaysA = signInSystem.getConsecutiveDays("A"); System.out.println(consecutiveDaysA); } ``` 希望能对你有所帮助!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值