You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 05:09:24