关于前端:dayjs计算连续打卡时间

4次阅读

共计 924 个字符,预计需要花费 3 分钟才能阅读完成。

前言

最近做的集体我的项目中,须要统计用户间断打卡的工夫。网上搜寻了很多材料,办法有很多。比方应用 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;
};

成果

数据库

后果

正文完
 0