Python实现连续登录天数统计 跨月场景计算问题求解
跨月连续在线天数统计修复方案
问题根因
原有实现存在两个核心错误,导致跨月场景计算失败:
- 仅通过
当日日数 - 偏移量的方式计算待比对日期,完全没有处理跨月时日期数字的跳变逻辑:比如6月1日往前推1天是5月31日,按原有减法算出来的日数是0,根本无法匹配上月的日期值,遇到闰年2月、跨年场景错误会更明显 - 遍历逻辑只要遇到不匹配的日期就直接重置计数并终止循环,没有做跨月的日期跳转判断,会直接中断连续统计
实现思路
不要手动计算月末日、跨月偏移,直接借助datetime的日期偏移能力自动处理所有日期边界场景:
- 先把接口返回的日月格式登录记录转成
(月, 日)格式的元组集合,查找时间复杂度为O(1),比遍历数组匹配效率高 - 从当日日期开始逐天往前偏移,每次偏移直接用
timedelta(days=1)做日期减法,自动处理跨月、跨年、闰年2月的日期计算 - 只要当前比对日期存在于登录记录集合中,连续天数就加1,直到遇到不存在的登录记录,直接终止统计即可
可直接运行的实现代码
import time import datetime # 原始登录日月数据 final = [ {'day': 29, 'month': 5},{'day': 30, 'month': 5},{'day': 1, 'month': 6}, {'day': 2, 'month': 6},{'day': 3, 'month': 6},{'day': 4, 'month': 6}, {'day': 5, 'month': 6},{'day': 6, 'month': 6}, {'day': 7, 'month': 6}, {'day': 8, 'month': 6}, {'day': 9, 'month': 6} ] # 预处理登录记录为集合,加速查找 login_set = set() for record in final: login_set.add((record['month'], record['day'])) # 获取当日日期 current_check_date = datetime.datetime.fromtimestamp(int(time.time())).date() continuous_streak = 0 while True: # 提取当前待校验日期的月、日 check_key = (current_check_date.month, current_check_date.day) if check_key in login_set: continuous_streak += 1 # 日期往前推1天,自动处理所有跨边界场景 current_check_date -= datetime.timedelta(days=1) else: # 遇到断签直接终止统计 break print(f"连续在线天数:{continuous_streak}")
逻辑验证
- 针对跨月示例数据:如果当日为6月9日,统计结果为11天(5月29日-6月9日连续无中断),符合预期
- 针对断签示例:登录记录为
{'day': 5, 'month': 6},{'day': 8, 'month': 6}, {'day': 9, 'month': 6},当日为6月9日时,往前校验9日存在、8日存在、7日不存在,统计结果为2,符合需求 - 自动兼容月末、闰年2月、跨年等所有特殊日期场景,不需要手动写月末日判断逻辑
内容的提问来源于stack exchange,提问作者back-new
相关产品推荐
相关产品推荐

