基于Es6语法,写一个函数,参数为两个时间格式的字符串, 1、当参数格式为 'yyyy-mm-dd' 格式的字符串时,返回为两个日期之间所有日期的数组(含入参日期),格式同入参,例如入参: '2023-6-8','2023-6-11',返回值为 ['2023-6-8','2023-6-9','2023-6-10','2023-6-11'] 2、当参数格式为 'yyyy-mm' 格式时,返回为两个月份之间所有月份的数组(含入参月份),格式同入参,例如入参: '2023-6','2023-11',返回值为 ['2023-6','2023-7','2023-8','2023-9','2023-10','2023-11'] 3、当参数格式为 'yyyy' 格式时,返回为两个年份之间所有年份的数组(含入参年份),格式同入参,例如入参: '2021','2023',返回值为 ['2021','2022','2023'] 4、当两个入参时间格式不一致时抛出异常。 5、当第二个参数不大于第一个参数的时间时抛出异常。 6、用单元测试代码验证代码可用性。
时间: 2023-12-30 10:02:02 浏览: 68
es6语法讲解.docx
下面是符合要求的代码实现:
```
/**
* 根据参数格式返回两个日期之间所有日期的数组、所有月份的数组或所有年份的数组
* @param {string} startDate 开始时间字符串,格式为 'yyyy'、'yyyy-mm' 或 'yyyy-mm-dd'
* @param {string} endDate 结束时间字符串,格式同 startDate
* @returns {Array} 所有日期、月份或年份的数组
*/
function getAllDateBetween(startDate, endDate) {
// 判断日期格式是否一致
const formatReg = /^(\d{4})(-)(\d{1,2})\2(\d{1,2})$/;
const isDate = formatReg.test(startDate) && formatReg.test(endDate);
const formatReg2 = /^(\d{4})(-)(\d{1,2})$/;
const isMonth = formatReg2.test(startDate) && formatReg2.test(endDate);
const formatReg3 = /^(\d{4})$/;
const isYear = formatReg3.test(startDate) && formatReg3.test(endDate);
if (!isDate && !isMonth && !isYear) {
throw new Error('参数格式不一致');
}
// 判断结束时间是否大于开始时间
const start = new Date(startDate);
const end = new Date(endDate);
if (end <= start) {
throw new Error('结束时间必须大于开始时间');
}
// 获取所有日期、月份或年份的数组
const dateArr = [];
if (isDate) {
let date = start;
while (date <= end) {
dateArr.push(date.toLocaleDateString().replace(/\//g, '-'));
date.setDate(date.getDate() + 1);
}
} else if (isMonth) {
let date = start;
while (date <= end) {
dateArr.push(date.toLocaleDateString().replace(/\//g, '-').slice(0, 7));
date.setMonth(date.getMonth() + 1);
}
} else if (isYear) {
let date = start;
while (date <= end) {
dateArr.push(date.getFullYear().toString());
date.setFullYear(date.getFullYear() + 1);
}
}
return dateArr;
}
```
下面是单元测试的代码实现:
```
describe('getAllDateBetween', () => {
it('当参数格式为 "yyyy-mm-dd" 格式的字符串时,返回为两个日期之间所有日期的数组(含入参日期),格式同入参', () => {
const startDate = '2023-6-8';
const endDate = '2023-6-11';
const result = getAllDateBetween(startDate, endDate);
expect(result).toEqual(['2023-6-8', '2023-6-9', '2023-6-10', '2023-6-11']);
});
it('当参数格式为 "yyyy-mm" 格式时,返回为两个月份之间所有月份的数组(含入参月份),格式同入参', () => {
const startDate = '2023-6';
const endDate = '2023-11';
const result = getAllDateBetween(startDate, endDate);
expect(result).toEqual(['2023-6', '2023-7', '2023-8', '2023-9', '2023-10', '2023-11']);
});
it('当参数格式为 "yyyy" 格式时,返回为两个年份之间所有年份的数组(含入参年份),格式同入参', () => {
const startDate = '2021';
const endDate = '2023';
const result = getAllDateBetween(startDate, endDate);
expect(result).toEqual(['2021', '2022', '2023']);
});
it('当两个入参时间格式不一致时抛出异常', () => {
const startDate = '2023-6-8';
const endDate = '2023';
expect(() => getAllDateBetween(startDate, endDate)).toThrow('参数格式不一致');
});
it('当第二个参数不大于第一个参数的时间时抛出异常', () => {
const startDate = '2023-6-8';
const endDate = '2023-6-7';
expect(() => getAllDateBetween(startDate, endDate)).toThrow('结束时间必须大于开始时间');
});
});
```
阅读全文