获取指定时间段的所有日期列表,支持转数组。代码如下
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))
结果