dayjs计算连续打卡时间

该项目统计用户连续打卡时间,通过dayjs在mysql查询用户打卡记录并判断连续性。首先获取最近打卡时间,判断是否在今天或昨天,然后遍历记录增加天数直至发现断开。数据库设计确保一天内仅能打卡一次,防止重复导致误差。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

最近做的个人项目中,需要统计用户连续打卡的时间。网上搜索了很多资料,方法有很多。比如使用mysql分组条件查询、窗口排序等。考虑到自己需求没有这么复杂,只需要计算最近一次的连续天数。就是直接使用dayjs计算。

思路

  1. mysql查询对应用户所有的打开记录,进行降序排序。
  2. 获取第一个时间,判断时候在今天或昨天的范围。
  3. 如果是则表示仍在连续打卡范围,如果不是直接返回0天
  4. 判断最后一次打开是否是今天,不是的话从昨天开始查找
  5. 每次遍历天数加一,直到发现不是连续的则中断遍历

这里数据添加的时候,限制了一天只能打卡一次。所以记录中没有重复天数的。如果返回的数据有重复的,会导致最后的连续天数有误差。可以考虑进行去重。

实现

const getContinueDay = (list: { checkInTime: string }[]) => {
  let day = 0;
  if (!list.length) return day;
  let nowStartDay = dayjs().startOf('day');
  const left = dayjs().subtract(1, 'day').startOf('day');
  const right = dayjs().endOf('day');
  if (dayjs(list[0].checkInTime).isBetween(left, right, null, '[]')) {
    if (!dayjs(list[0].checkInTime).isSame(nowStartDay, 'day')) {
      nowStartDay = nowStartDay.subtract(1, 'day');
    }
    for (const i of list) {
      const dayStart = dayjs(nowStartDay).startOf('day');
      const dayEnd = dayjs(nowStartDay).endOf('day');
      if (!dayjs(i.checkInTime).isBetween(dayStart, dayEnd, 'day', '[]')) break;
      day++;
      nowStartDay = nowStartDay.subtract(1, 'day');
    }
  }
  return day;
};

效果

数据库

image.png

结果

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值