一个日期范围 如'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]的时间序列,这个要怎么获得
一个日期范围 如'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]的时间序列,这个要怎么获得
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
]
不知道这个时间序列是不是你想要的那种。
10 回答11.2k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答4.9k 阅读✓ 已解决
2 回答4.8k 阅读✓ 已解决
4 回答4.4k 阅读✓ 已解决