需求:当前日期或指定日期所在的整年、整季度、整月;当前日期或指定日期所在的上一年、上个季度、上个月。
注:这里的整月不是固定的30天,是根据下个月的第一天倒推的,年份季度同理
最简单的获取当前日期或指定日期整月
/* eslint-disable eqeqeq */
// 获取当前月份的第一天、最后一天
export function getMonthDate(params) {
const date = params ? new Date(params) : new Date();
const getYear = date.getFullYear(); // 当前年
const getMonth = date.getMonth(); // 当前月
const firstDay = new Date(getYear, getMonth, 1); // 当前月份的第一天
let nextMonth = getMonth + 1; // 下一个月
let nextYear = getYear; // 下一年
if (nextMonth > 12) {
nextMonth -= 12;
nextYear += 1;
}
const nextDay = new Date(nextYear, nextMonth, 1); // 获取下个月的第一天
const lastDay = new Date(nextDay.getTime() - 1000 * 60 * 60 * 24); // 获取当前月份的最后一天
return [firstDay, lastDay];
}
// 获取当前年份的第一天、最后一天
export function getYearDate(params) {
const date = params ? new Date(params) : new Date();
const getYear = date.getFullYear(); // 当前年
const firstDay = new Date(getYear, 0, 1); // 当前年份的第一天
const nextDay = new Date(getYear + 1, 0, 1); // 获取下一年的第一天
const lastDay = new Date(nextDay.getTime() - 1000 * 60 * 60 * 24); // 获取当前年份的最后一天
return [firstDay, lastDay];
}
上面的方法都是一个一个单独的,而且如果年、季度、月都要的话,好多的重复代码,所以我又给搞了一个整合版本,哈,只需要传入对应需要获取的日期类型就可以了
/***** 获取当前日期所在的日期范围,整月、整季度、 整年,整半年
****** 传入参数: date,type
****** 参数说明:
****** ******* date 需要获取的时间日期,默认当前日期
****** ******* type month 月份
****** ******* quarter 季度
****** ******* half 半年
****** ******* year 年份 默认
*****/
export function getDateRange(date, type) {
const newDate = date ? new Date(date) : new Date(); // 格式化传入日期 或者 获取当前日期
const range = type || 'year'; // 重置范围类型
const newYear = newDate.getFullYear(); // 获取传入日期年份 或者 当前年份
const newMonth = newDate.getMonth(); // 获取传入月份 或者 当前月份
let firstDay = new Date(); // 根据类型,最终赋值,第一天当年、当月、当季度)
let lastDay = new Date(); // 根据类型,最终赋值,最后一天(当年、当月、当季度)
// 整月 // 季度 // 半年
if (range !== 'year') {
let arr = [];
if (range === 'month') arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
if (range === 'quarter')
arr = [
[0, 1, 2],
[3, 4, 5],
[6, 7, 8],
[9, 10, 11],
];
if (range === 'half')
arr = [
[0, 1, 2, 3, 4, 5],
[6, 7, 8, 9, 10, 11],
];
arr.forEach(item => {
if (range === 'month' ? item === newMonth : item.indexOf(newMonth) > -1) {
let nextMonth =
range === 'month'
? item + 1
: range === 'quarter'
? item[2] + 1
: item[item.length - 1] + 1; // 下个月
let firstMonth = range === 'month' ? item : item[0]; // 当前月/当前时间范围首月
let nextYear = newYear; // 下一年
if (nextMonth > 12) {
// 判断是否是下一年
nextMonth -= 12;
nextYear += 1;
}
const nextDay = new Date(nextYear, nextMonth, 1); // 获取下个月的第一天
lastDay = new Date(nextDay.getTime() - 1000 * 60 * 60 * 24); // 获取当前月份的最后一天
firstDay = new Date(newYear, firstMonth, 1); // 当前日期范围第一天
}
});
}
// 整年
if (range === 'year') {
const nextDay = new Date(newYear + 1, 0, 1); // 获取下一年的第一天
lastDay = new Date(nextDay.getTime() - 1000 * 60 * 60 * 24); // 获取当前年份的最后一天
firstDay = new Date(newYear, 0, 1); // 当前年份的第一天
}
return [firstDay, lastDay]; // 最终返回的时间范围
}
/*****
***** 从当前日期开始倒推 一月、一季度、半年、一年
***** 参数:date,type
****** 参数说明:
****** ******* date 需要获取的时间日期,默认当前日期
****** ******* type month 月份
****** ******* quarter 季度
****** ******* half 半年
****** ******* year 年份 默认
*/
export function getDateLastRange(date, type) {
const newDate = date ? new Date(date) : new Date(); // 格式化传入日期 或者 获取当前日期
const range = type || 'year'; // 重置范围类型
const newYear = newDate.getFullYear(); // 获取年
const newMonth = newDate.getMonth(); // 获取月
const newDay = newDate.getDate(); // 获取日
// console.log(newDate, newDay);
let firstDay = new Date(); // 根据类型,最终赋值,第一天当年、当月、当季度)
let lastDay = new Date(); // 根据类型,最终赋值,最后一天(当年、当月、当季度)
// 整月 // 季度 // 半年
if (range !== 'year') {
let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
arr.forEach(item => {
if (item === newMonth) {
let last =
range === 'month'
? item - 1
: range === 'quarter'
? item - 3
: range === 'quarter'
? item - 6
: item; // 上个月
let lastYear = last > -1 ? newYear : newYear - 1; // 上一年
const lastMonth = last > -1 ? arr[last] : arr[arr.length + last];
firstDay = new Date(lastYear, lastMonth, newDay); // 当前日期范围第一天
lastDay = new Date(new Date().getTime() - 1000 * 60 * 60 * 24); // 获取当前日期范围的最后一天
}
});
}
// 整年
if (range === 'year') {
lastDay = newDate; // 今天
firstDay = new Date(newYear - 1, newMonth, newDay); // 上一年的今天
}
return [firstDay, lastDay]; // 最终返回的时间范围
}