怎么获取日期范围的时间序列

一个日期范围 如'2020-12-11' 到 '2020-12-16' 要获取一个格式为[2020-12-11 00:00 ~ 00:59, 2020-12-11 01:00 ~ 01:59...., 2020-12-16 23:00 ~ 23:59]的时间序列,这个要怎么获得

阅读 4k
5 个回答
function zeroPrefix(value) {
    return (value + '').padStart(2, '0');
}

function dateTimeListBuilder(startTime, endTime) {
    const [startYear, startMonth, startDate] = startTime.split('-');
    const [endYear, endMonth, endDate] = endTime.split('-');
    const startTimestamp = new Date(startYear, startMonth - 1, startDate).getTime();
    const endTimestamp = new Date(endYear, endMonth - 1, endDate, 23, 59, 59).getTime();
    
    if (startTimestamp > endTimestamp) {
        alert('开始时间应小于结束时间');
        return;
    }
    
    const result = [];
    const mapper = new Array(24).fill(0);
    
    for (let i = startTimestamp, j = 0; i <= endTimestamp; i += 86400000, j++) {
        const currentDate = new Date(startYear, startMonth - 1, +startDate + j);
        
        result.push(
            ...mapper.map((_, index) => {
                index = zeroPrefix(index);
                
                return `${currentDate.getFullYear()}-${zeroPrefix(currentDate.getMonth() + 1)}-${zeroPrefix(currentDate.getDate())} ${index}:00-${index}:59`;
            })
        );
    }
    
    return result;
}

dateTimeListBuilder('2020-12-11', '2020-12-16');
// 甚至可以这么传参
dateTimeListBuilder('2020-13-1', '2021-1-5');
function getResult(d1, d2) {
    const getString = (date) => {
        const f = n => String(n).padStart(2, '0')
        const year = date.getFullYear()
        const month = date.getMonth() + 1
        const day = date.getDate()
        const hour = date.getHours()
        return `${year}-${f(month)}-${f(day)} ${f(hour)}:00 ~ ${f(hour)}:59`
    }
    const result = [], startDate = new Date(d1), endDate = new Date(d2)
    startDate.setHours(0)
    endDate.setHours(0)
    endDate.setDate(endDate.getDate() + 1)
    while (startDate < endDate) {
        result.push(getString(startDate))
        startDate.setHours(startDate.getHours() + 1)
    }
    return result
}

测试

console.log(getResult('2020-11-11', '2020-11-13'))

简单,循环即可.
依赖一个时间库dayjs

const dayjs = require("dayjs");

function timeRange(start, end) {
  let now = dayjs(start);
  end = dayjs(end);
  let result = [];
  while (now.isBefore(end)) {
    result.push(
      result.push(now.format("YYYY-MM-DD HH:mm ~ HH:59"))
    );
    now = now.add(1, "hour");
  }

  return result;
}
console.log(timeRange("2020-12-11", "2020-12-13"));

/**
 * 给数字前缀补0填充
 * @param n 数字
 * @param bit 数字填充后位数
 */
function prefixZero(n: number, bit: number): string {
    const minNumberLen = `${n}`.length
    return `${"0".repeat(bit - minNumberLen)}${n}`
}

/**
 * 格式化文本 -> 2020-4-1
 * @param date 日期
 * @param needPrefixZero 是否需要自动给月份和日期前缀补0
 */
function format(date: Date, needPrefixZero?: boolean): string {
    if (needPrefixZero) {
        return `${date.getFullYear()}-${prefixZero(date.getMonth() + 1, 2)}-${prefixZero(date.getDate(), 2)}`
    }
    return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`
}

/**
 * 生成指定日期的指定小时的时间序列
 * @param date 日期
 * @param hour 小时(0-23)
 */
function makeHourSerial(date: Date, hour: number): string[] {
    return new Array(60).fill(0).map((_, i) => {
        //  如果生成的日期需要 2020-4-5 => 2020-04-05,format函数指定第二个参数即可
        return `${format(date)} ${prefixZero(hour, 2)}:${prefixZero(i, 2)}`
    })
}

/**
 * 生成指定日期全天24小时的时间序列
 * @param date 日期
 */
function makeWholeDaySerial(date: Date): string[] {
    const list = new Array(24).fill(0).map((_, i) => makeHourSerial(date, i))
    const resultList = []
    for (let i = 0; i < list.length; i++) {
        for (let h = 0; h < list[i].length; h++) {
            resultList.push(list[i][h])
        }
    }
    return resultList
}

/**
 * 两个日期是否是同一天
 * @param a 日期
 * @param b 日期
 */
function isSameDate(a: Date, b: Date): boolean {
    const same = {
        year: a.getFullYear() === b.getFullYear(),
        month: a.getMonth() === b.getMonth(),
        date: a.getDate() === b.getDate()
    }
    return same.year && same.month && same.date
}

/**
 * 生成指定两个日期之间的所有时间序列,结果为数组,每个数组项格式'2020-04-01
 * @param start 开始时间
 * @param end 结束时间
 */
function makeDateSerial(start: Date, end: Date): string[] {
    const date = new Date(start)
    const resultList: string[] = []
    while (!isSameDate(date, end)) {
        makeWholeDaySerial(date).forEach(text => {
            resultList.push(text)
        })
        date.setDate(date.getDate() + 1)
    }
    return resultList
}


// 注意 0表示一月,但是显示成文字会写成现实世界标准
const start = new Date(2021, 0, 4)
const end = new Date(2021, 0, 10)
console.log(makeDateSerial(start, end))

以下是运行结果

[
  '2021-1-4 00:00', '2021-1-4 00:01', '2021-1-4 00:02', '2021-1-4 00:03',
  '2021-1-4 00:04', '2021-1-4 00:05', '2021-1-4 00:06', '2021-1-4 00:07',
  '2021-1-4 00:08', '2021-1-4 00:09', '2021-1-4 00:10', '2021-1-4 00:11',
  '2021-1-4 00:12', '2021-1-4 00:13', '2021-1-4 00:14', '2021-1-4 00:15',
  '2021-1-4 00:16', '2021-1-4 00:17', '2021-1-4 00:18', '2021-1-4 00:19',
  '2021-1-4 00:20', '2021-1-4 00:21', '2021-1-4 00:22', '2021-1-4 00:23',
  '2021-1-4 00:24', '2021-1-4 00:25', '2021-1-4 00:26', '2021-1-4 00:27',
  '2021-1-4 00:28', '2021-1-4 00:29', '2021-1-4 00:30', '2021-1-4 00:31',
  '2021-1-4 00:32', '2021-1-4 00:33', '2021-1-4 00:34', '2021-1-4 00:35',
  '2021-1-4 00:36', '2021-1-4 00:37', '2021-1-4 00:38', '2021-1-4 00:39',
  '2021-1-4 00:40', '2021-1-4 00:41', '2021-1-4 00:42', '2021-1-4 00:43',
  '2021-1-4 00:44', '2021-1-4 00:45', '2021-1-4 00:46', '2021-1-4 00:47',
  '2021-1-4 00:48', '2021-1-4 00:49', '2021-1-4 00:50', '2021-1-4 00:51',
  '2021-1-4 00:52', '2021-1-4 00:53', '2021-1-4 00:54', '2021-1-4 00:55',
  '2021-1-4 00:56', '2021-1-4 00:57', '2021-1-4 00:58', '2021-1-4 00:59',
  '2021-1-4 01:00', '2021-1-4 01:01', '2021-1-4 01:02', '2021-1-4 01:03',
  '2021-1-4 01:04', '2021-1-4 01:05', '2021-1-4 01:06', '2021-1-4 01:07',
  '2021-1-4 01:08', '2021-1-4 01:09', '2021-1-4 01:10', '2021-1-4 01:11',
  '2021-1-4 01:12', '2021-1-4 01:13', '2021-1-4 01:14', '2021-1-4 01:15',
  '2021-1-4 01:16', '2021-1-4 01:17', '2021-1-4 01:18', '2021-1-4 01:19',
  '2021-1-4 01:20', '2021-1-4 01:21', '2021-1-4 01:22', '2021-1-4 01:23',
  '2021-1-4 01:24', '2021-1-4 01:25', '2021-1-4 01:26', '2021-1-4 01:27',
  '2021-1-4 01:28', '2021-1-4 01:29', '2021-1-4 01:30', '2021-1-4 01:31',
  '2021-1-4 01:32', '2021-1-4 01:33', '2021-1-4 01:34', '2021-1-4 01:35',
  '2021-1-4 01:36', '2021-1-4 01:37', '2021-1-4 01:38', '2021-1-4 01:39',
  ... 8540 more items
  ]

不知道这个时间序列是不是你想要的那种。

提供一下思路:
首先计算出时间差值(小时),然后只需要一次循环创建时间序列,注意处理进位就行。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题