说明
签到功能根据业务情况的不同大致分为两种,一种是只要进入系统就会默认签到,另外一种是进入系统之后需要用户手动点击签到按钮进行签到。两种情况最大的区别就是,自动签到连续签到天数肯定至少为1天。而手动签到的情况则需要考虑断签的情况。

1、自动签到下统计连续签到天数

    public static void main(String[] args) {try {/*** 造一些测试数据,这里就不去数据库里查了,一般正常是数据库有个表记录签到记录*/List<String> signInDateStrs = new ArrayList<>();signInDateStrs.add("2019-12-31");signInDateStrs.add("2020-01-01");signInDateStrs.add("2020-01-02");List<Date> signInDates = new ArrayList<>();for (String dateStr : signInDateStrs) {Calendar calendarTo = Calendar.getInstance();calendarTo.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(dateStr));Calendar c = Calendar.getInstance();c.setTimeInMillis(0);c.set(calendarTo.get(Calendar.YEAR), calendarTo.get(Calendar.MONTH),calendarTo.get(Calendar.DAY_OF_MONTH), 0, 0, 0);signInDates.add(c.getTime());}int count = persistentDay(signInDates);System.out.println("连续签到了" + count + "天");} catch (ParseException e) {e.printStackTrace();}}/*** 自动签到的情况,只要一进入系统就会签到,所以连续签到肯定至少为1天* @param signInDates* @return*/private static int persistentDay(List<Date> signInDates){//定义一个变量表示连续签到天数,从1开始int continuousDays = 1;//1. 注意先对时间进行从小到大排序(可以在数据库里查的时候就根据时间排序,也可以查询出来之后再排序)/*** 2. 从最大的时间开始往前比较,因为我们是要拿连续签到的时间,这样才有意义,减少无谓的比较*/Calendar later = Calendar.getInstance();Calendar before = Calendar.getInstance();for (int i = signInDates.size() - 1; i > 0; i--){later.setTime(signInDates.get(i));before.setTime(signInDates.get(i - 1));//前一天 + 1天 = 后一天,则视为连续签到before.add(Calendar.DAY_OF_MONTH,1);if (later.get(Calendar.YEAR) == before.get(Calendar.YEAR)&& later.get(Calendar.MONTH) == before.get(Calendar.MONTH)&& later.get(Calendar.DAY_OF_YEAR) == before.get(Calendar.DAY_OF_YEAR)){continuousDays++;}else {//只要遇到不连续的就不用再往前比较了break;}}return continuousDays;}

2、手动签到下统计连续签到天数

    public static void main(String[] args) {/*** 造一些测试数据,为了简单演示就不去数据库查寻签到记录了* 注意时间要从小到大排序,如果从数据库里查询的时候,可以根据这个时间进行order by* 也可以查询出来再程序排序*/List<String> signInDateStrs = new ArrayList<>();signInDateStrs.add("2019-12-31");signInDateStrs.add("2020-03-02");signInDateStrs.add("2020-03-03");List<Date> signInDates = new ArrayList<>();try {for (String dateStr : signInDateStrs) {Calendar calendarTo = Calendar.getInstance();calendarTo.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(dateStr));Calendar c = Calendar.getInstance();c.setTimeInMillis(0);c.set(calendarTo.get(Calendar.YEAR), calendarTo.get(Calendar.MONTH),calendarTo.get(Calendar.DAY_OF_MONTH), 0, 0, 0);signInDates.add(c.getTime());}} catch (ParseException e) {e.printStackTrace();}int count = persistentDay(signInDates);System.out.println("已连续签到 " + count + "天");}/*** 需要手动点击签到的情况* @param signInDates* @return*/private static int persistentDay(List<Date> signInDates) {//定义一个变量表示连续签到天数,从1开始int continuousDays = 1;/*** 如果手动签到的话需要考虑* 把排序之后的签到记录时间中最大的那个时间拿出来与 昨天 进行比较,如果相等证明还是连续签到的,如果不等则连续签到变成0*/Calendar yesterday = Calendar.getInstance();yesterday.setTime(new Date());yesterday.add(Calendar.DAY_OF_MONTH, -1);Calendar lastDay = Calendar.getInstance();lastDay.setTime(signInDates.get(signInDates.size() - 1));if (yesterday.get(Calendar.YEAR) != lastDay.get(Calendar.YEAR)|| yesterday.get(Calendar.MONTH) != lastDay.get(Calendar.MONTH)|| yesterday.get(Calendar.DAY_OF_YEAR) != lastDay.get(Calendar.DAY_OF_YEAR)) {//昨天没有签到continuousDays = 0;return continuousDays;}/*** 2. 从最大的时间开始往前比较,因为我们是要拿连续签到的时间,这样才有意义,减少无谓的比较*/Calendar later = Calendar.getInstance();Calendar before = Calendar.getInstance();for (int i = signInDates.size() - 1; i > 0; i--) {later.setTime(signInDates.get(i));before.setTime(signInDates.get(i - 1));//前一天 + 1天 = 后一天,则视为连续签到before.add(Calendar.DAY_OF_MONTH, 1);if (later.get(Calendar.YEAR) == before.get(Calendar.YEAR)&& later.get(Calendar.MONTH) == before.get(Calendar.MONTH)&& later.get(Calendar.DAY_OF_YEAR) == before.get(Calendar.DAY_OF_YEAR)) {continuousDays++;} else {//只要遇到不连续的就不用再往前比较了break;}}return continuousDays;}

Java 统计连续签到天数相关推荐

  1. mysql 连续签到天数_获取连续登陆天数,连续签到天数 ,方法优化

    获取连续登陆天数,连续签到天数,类似这样的需求应该是一个常见的需求,那么我们有没有一套成熟的解决方案呢 ?下面我来跟大家分享一下我的故事. 在猴年马月的一天,有个用户反馈个人中心打开缓慢,需要7.8秒 ...

  2. CSDN是怎么实现用户签到,统计签到次数,连续签到天数等功能微服务的

    文章目录 需求分析 设计思路 用户签到和统计连续签到的次数 签到控制层 SignController 签到业务逻辑层 SignService 测试 按月统计用户签到的次数 签到控制层 SignCont ...

  3. mysql 连续签到天数_天天拿帮会通宝 帮会签到真给力

    在<天龙八部手游>中,绝大多数少侠都拥有自己的帮会,每天和帮会兄弟姐妹们做着各种帮会活动,大家彼此配合默契,荣辱与共,其乐融融.为了尽可能地满足少侠对帮会通宝的需求,现在帮会又多了一项帮会 ...

  4. mysql 连续签到天数_新版签到活动明天上线,福利活动抢鲜看~

    明天游戏中心app旧版福利签到活动马上就要结束啦,虽然很多的魅友反馈说积分签到结束的太早,积分不够换5折券,不过更早的开启新版签到才能更快的享受到更好的福利嘛~ 今晚0点新版签到活动即将上线,接下来就 ...

  5. mysql 连续签到天数_签到功能实现,没有你想的那么复杂(一)

    1 签到定义以及作用签到,指在规定的簿册上签名或写一"到"字,表示本人已经到达.在APP中使用此功能,可以增加用户粘性和活跃度.2 技术选型redis为主写入查询,mysql辅助查 ...

  6. HiveSQL面试题18--腾讯面试用户连续签到天数及历史最大连续签到天数问题

    目录 0 题目 1 数据准备 3 数据分析 4 小结 0 题目 有一张用户签到表[t_user_attendence],标记每天用户是否签到(说明:该表包含所有用户所有工作日的出勤记录) ,包含三个字 ...

  7. java实现连续签到加分_java实现app签到功能

    本文实例为大家分享了java实现app签到功能的具体代码,供大家参考,具体内容如下 1.首先设计二张表,第一张表sign_calc记录用户连续签到次数,字段id,user_id,continue_da ...

  8. sql server计算日期到当前日期天数_Excel如何统计连续停机天数问题

    前几天有个朋友问了一个关于连续时间统计的问题,使用Power Query for Excel来解决的.今天在张俊红老师的公众号上看到了使用使用SQL来解决连续时间的统计问题.这个问题是一个非常经典的例 ...

  9. mysql 连续签到天数_最大连续签到天数-sql

    SELECT MIN(rq) as 起始日期 , MAX(rq) as 终止日期 , MAX(id1) - MIN(id1) + 1 as 持续天数 ,id3 as 累计签到天数 ,name FROM ...

  10. mysql5.7查询连续登录/连续签到天数

    1.DDL CREATE TABLE `user_sign_record` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键i ...

最新文章

  1. 如何用C#动态编译、执行代码
  2. openstack安装在虚拟机上重启之后无法启动问题
  3. VMware拍摄快照(系统备份)
  4. 2.3.4 操作系统之信号量机制(整型信号量、记录型信号量P、V)
  5. 怪物刷新时间计时_热血传奇;散人对这类怪物可谓是情有独钟
  6. java关于校园共享单车_关于校园文明骑行共享单车倡议书
  7. 《剑指Offer》 二维数组中的查找
  8. HDU_5688 (map)
  9. 金蝶14.0系统服务器安装教程,大神面对win7系统安装金蝶kis14.0的方式
  10. 王鉴老师--沪师经纪-刘建
  11. php ma,第十四届萌芽杯优秀作品展示第一期
  12. 非线性方程(组):高维方程解法
  13. 大龄青年能转行IT吗?30岁老哥现身说法
  14. luogu 1094
  15. 企业管理概论试题库【1】
  16. 塞班java软件下载,附项目源码
  17. 小程序 --- 实现多选功能
  18. 2012多媒体音乐盒大全(酷狗,酷我,一听)
  19. 向微信公众号文章中添加pdf、jpg、png、xlsx等文件
  20. 计算机基础教程试题及答案,2017计算机基础教程考试题「附答案」

热门文章

  1. nyoj-34-韩信点兵
  2. 智力游戏教案c语言代码,幼儿园智力游戏教案分析
  3. 益智app游戏 android,儿童宝宝益智游戏
  4. 计算机发送到桌面快捷方式,win10系统右键菜单“发送到桌面快捷方式”选项不见了的详细步骤...
  5. 资深项目经理推荐的几款免费/开源项目管理工具
  6. DOORS入门教程系列:基本概念介绍(一)
  7. 如何选择家庭私有云NAS方案?家庭NAS存储服务器的重要性
  8. java中如何插入表格_Java如何向Word文档中添加表格?
  9. ae预览绿条不完整_AE不能预览全部视频的原因分析及解决方案
  10. iPhone手机蓝牙找不到AirPods耳机的解决方法