原生JavaScript获取某一段时间内的所有日期列表

获取指定时间段的所有日期列表,支持转数组。代码如下

  const getYMD = (date = new Date()) => {
    const y = date.getFullYear()
    const m = date.getMonth() + 1
    const d = date.getDate()
    return { y, m, d }
  }
  const isSameYear = (t1, t2) => t1.getFullYear() === t2.getFullYear()
  const isSameMonth = (t1, t2) => t1.getMonth() === t2.getMonth()
  const isRightTime = (t1, t2) => t1.getTime() <= t2.getTime()
  const getCurrentMDays = (y, m) => new Date(y, m, 0).getDate()
  const getDayMaps = (startTime, endTime) => {
    const dayMap = {}
    if (!isRightTime(startTime, endTime)) return dayMap
    const isSameY = isSameYear(startTime, endTime)
    const isSameM = isSameMonth(startTime, endTime)
    let { y: startY, m: startM, d: startD } = getYMD(startTime)
    let { y: endY, m: endM, d: endD } = getYMD(endTime)
    if (isSameY) {
      dayMap[startY] = Array(13).fill(undefined)
      if (isSameM) {
        const tmp = []
        while (endD - startD >= 0) {
          tmp.push(startD)
          startD++
        }
        dayMap[startY][startM] = tmp
      } else {
        const startCM = startM
        while (endM - startM >= 0) {
          const tmp = []
          const days = endM !== startM ? getCurrentMDays(startY, startM) : endD
          const startDay = startCM === startM ? startD : 1
          for (let i = startDay; i <= days; i++) {
            tmp.push(i)
          }
          dayMap[startY][startM] = tmp
          startM++
        }
      }
    } else {
      const startCY = startY
      while (endY - startY >= 0) {
        dayMap[startY] = Array(13).fill(undefined)
        if (endY === startY) {
          for (let m = 1; m <= endM; m++) {
            const tmp = []
            const days = m !== endM ? getCurrentMDays(startY, m) : endD
            for (let i = 1; i <= days; i++) {
              tmp.push(i)
            }
            dayMap[startY][m] = tmp
          }
        } else {
          if (startCY === startY) {
            for (let m = startM; m <= 12; m++) {
              const tmp = []
              const days = getCurrentMDays(startY, m)
              const startDay = m === startM ? startD : 1
              for (let i = startDay; i <= days; i++) {
                tmp.push(i)
              }
              dayMap[startY][m] = tmp
            }
          } else {
            for (let m = 1; m <= 12; m++) {
              const tmp = []
              const days = getCurrentMDays(startY, m)
              for (let i = 1; i <= days; i++) {
                tmp.push(i)
              }
              dayMap[startY][m] = tmp
            }
          }
        }
        startY++
      }
    }
    return dayMap
  }
  const dayMapToArr = (map = {}) => {
    const arr = []
    Object.keys(map).forEach(year => {
      map[year].forEach((month, index) => {
        month && month.forEach(day => {
          arr.push(`${year}/${index}/${day}`)
        })
      })
    })
    return arr
  }

使用如下,要转其他格式,遍历getDayMaps的返回值自定义即可

const map = getDayMaps(new Date('2022,10,05'), new Date('2022,10,21'))
console.log(map)
console.log(dayMapToArr(map))

结果
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值