Java 统计连续签到天数
说明
签到功能根据业务情况的不同大致分为两种,一种是只要进入系统就会默认签到,另外一种是进入系统之后需要用户手动点击签到按钮进行签到。两种情况最大的区别就是,自动签到连续签到天数肯定至少为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 统计连续签到天数相关推荐
- mysql 连续签到天数_获取连续登陆天数,连续签到天数 ,方法优化
获取连续登陆天数,连续签到天数,类似这样的需求应该是一个常见的需求,那么我们有没有一套成熟的解决方案呢 ?下面我来跟大家分享一下我的故事. 在猴年马月的一天,有个用户反馈个人中心打开缓慢,需要7.8秒 ...
- CSDN是怎么实现用户签到,统计签到次数,连续签到天数等功能微服务的
文章目录 需求分析 设计思路 用户签到和统计连续签到的次数 签到控制层 SignController 签到业务逻辑层 SignService 测试 按月统计用户签到的次数 签到控制层 SignCont ...
- mysql 连续签到天数_天天拿帮会通宝 帮会签到真给力
在<天龙八部手游>中,绝大多数少侠都拥有自己的帮会,每天和帮会兄弟姐妹们做着各种帮会活动,大家彼此配合默契,荣辱与共,其乐融融.为了尽可能地满足少侠对帮会通宝的需求,现在帮会又多了一项帮会 ...
- mysql 连续签到天数_新版签到活动明天上线,福利活动抢鲜看~
明天游戏中心app旧版福利签到活动马上就要结束啦,虽然很多的魅友反馈说积分签到结束的太早,积分不够换5折券,不过更早的开启新版签到才能更快的享受到更好的福利嘛~ 今晚0点新版签到活动即将上线,接下来就 ...
- mysql 连续签到天数_签到功能实现,没有你想的那么复杂(一)
1 签到定义以及作用签到,指在规定的簿册上签名或写一"到"字,表示本人已经到达.在APP中使用此功能,可以增加用户粘性和活跃度.2 技术选型redis为主写入查询,mysql辅助查 ...
- HiveSQL面试题18--腾讯面试用户连续签到天数及历史最大连续签到天数问题
目录 0 题目 1 数据准备 3 数据分析 4 小结 0 题目 有一张用户签到表[t_user_attendence],标记每天用户是否签到(说明:该表包含所有用户所有工作日的出勤记录) ,包含三个字 ...
- java实现连续签到加分_java实现app签到功能
本文实例为大家分享了java实现app签到功能的具体代码,供大家参考,具体内容如下 1.首先设计二张表,第一张表sign_calc记录用户连续签到次数,字段id,user_id,continue_da ...
- sql server计算日期到当前日期天数_Excel如何统计连续停机天数问题
前几天有个朋友问了一个关于连续时间统计的问题,使用Power Query for Excel来解决的.今天在张俊红老师的公众号上看到了使用使用SQL来解决连续时间的统计问题.这个问题是一个非常经典的例 ...
- mysql 连续签到天数_最大连续签到天数-sql
SELECT MIN(rq) as 起始日期 , MAX(rq) as 终止日期 , MAX(id1) - MIN(id1) + 1 as 持续天数 ,id3 as 累计签到天数 ,name FROM ...
- mysql5.7查询连续登录/连续签到天数
1.DDL CREATE TABLE `user_sign_record` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键i ...
最新文章
- 如何用C#动态编译、执行代码
- openstack安装在虚拟机上重启之后无法启动问题
- VMware拍摄快照(系统备份)
- 2.3.4 操作系统之信号量机制(整型信号量、记录型信号量P、V)
- 怪物刷新时间计时_热血传奇;散人对这类怪物可谓是情有独钟
- java关于校园共享单车_关于校园文明骑行共享单车倡议书
- 《剑指Offer》 二维数组中的查找
- HDU_5688 (map)
- 金蝶14.0系统服务器安装教程,大神面对win7系统安装金蝶kis14.0的方式
- 王鉴老师--沪师经纪-刘建
- php ma,第十四届萌芽杯优秀作品展示第一期
- 非线性方程(组):高维方程解法
- 大龄青年能转行IT吗?30岁老哥现身说法
- luogu 1094
- 企业管理概论试题库【1】
- 塞班java软件下载,附项目源码
- 小程序 --- 实现多选功能
- 2012多媒体音乐盒大全(酷狗,酷我,一听)
- 向微信公众号文章中添加pdf、jpg、png、xlsx等文件
- 计算机基础教程试题及答案,2017计算机基础教程考试题「附答案」
热门文章
- nyoj-34-韩信点兵
- 智力游戏教案c语言代码,幼儿园智力游戏教案分析
- 益智app游戏 android,儿童宝宝益智游戏
- 计算机发送到桌面快捷方式,win10系统右键菜单“发送到桌面快捷方式”选项不见了的详细步骤...
- 资深项目经理推荐的几款免费/开源项目管理工具
- DOORS入门教程系列:基本概念介绍(一)
- 如何选择家庭私有云NAS方案?家庭NAS存储服务器的重要性
- java中如何插入表格_Java如何向Word文档中添加表格?
- ae预览绿条不完整_AE不能预览全部视频的原因分析及解决方案
- iPhone手机蓝牙找不到AirPods耳机的解决方法