JS 返回两个时间之间的所有日期、月份、年份、季度
1、日期
/**
* 获取两日期之间日期列表函数
* 返回两个时间之间所有的日期
* 参数示例 ('2021-05-31','2021-06-30')
* **/
export const getTimeTwo = (start, end) => {
//初始化日期列表,数组
let diffdate = new Array();
let arr = []
let i = 0;
//开始日期小于等于结束日期,并循环
while (start <= end) {
diffdate[i] = start;
//获取开始日期时间戳
let stime_ts = new Date(start).getTime();
//增加一天时间戳后的日期
let next_date = stime_ts + (24 * 60 * 60 * 1000);
//拼接年月日,这里的月份会返回(0-11),所以要+1
let next_dates_y = new Date(next_date).getFullYear() + '-';
let next_dates_m = (new Date(next_date).getMonth() + 1 < 10) ? '0' + (new Date(next_date).getMonth() + 1) + '-' : (new Date(next_date).getMonth() + 1) + '-';
let next_dates_d = (new Date(next_date).getDate() < 10) ? '0' + new Date(next_date).getDate() : new Date(next_date).getDate();
start = next_dates_y + next_dates_m + next_dates_d;
//增加数组key
i++;
}
return diffdate;
}
2、月份
/**
* 获取两个日期中所有的月份
* 返回两个时间之间所有的月份
* 参数示例 ('2021-01-01','2021-06-01')
* **/
export const getMonthBetween = (start, end) => {
let result = [];
//let min = new Date(start);
//let max = new Date(end);
// 解决传入非1号日期
let min = new Date(new Date(start).setDate(1));
let max = new Date(new Date(end).setDate(1));
let curr = min;
do{
let month = new Date(curr).getMonth() + 1;
let t = ""
if (month < 10) {
t = '0' + month
} else t = month
let str = curr.getFullYear() + "-" + (t);
result.push(str);
if (month == 12) {
curr.setFullYear(new Date(curr).getFullYear() + 1)
curr.setMonth(0)
} else curr.setMonth(month);
} while (curr <= max)
return result;
}
3、年份
/**
* 获取两个日期中所有的年份
* 返回两个时间之间所有的年份
* 参数示例 ('2021-01-01','2021-01-01')
* **/
export const getYearBetween = (start, end) => {
let result = [];
let min = new Date(start).getFullYear();
let max = new Date(end).getFullYear();
while (min <= max) {
result.push(min);
min = (Number(min) + 1)
}
return result;
}
4、季度
/**
* 获取两个日期中所有的季度
* 返回两个时间之间所有的季度
* 参数示例 ('2021-01-01','2022-01-01')
* 返回 ['2021-1','2021-2','2021-3','2021-4','2022-1']
* **/
export const getQuarterBetween = (startTime, endTime) => {
startTime = new Date(startTime)
endTime = new Date(endTime)
let quarter = []
// 与结束时间对比哪个大,比结束时间大则跳出,小于结束时间则继续计算下一个季度
while (startTime < endTime) {
let currentQuarter = quarterFun(new Date(startTime).getMonth() + 1)
let year = new Date(startTime).getFullYear()
quarter.push(year + '-' + currentQuarter)
// 下一个判断时间
startTime = nextQuarterLastDate(new Date(startTime).getFullYear(), currentQuarter)
}
// 判断季度
function quarterFun(currMonth) {
let currentQuarter = Math.floor((currMonth % 3 == 0 ? (currMonth / 3) : (currMonth / 3 + 1)))
return currentQuarter
}
// 返回下个季度的第一日
function nextQuarterLastDate(year, currentQuarter) {
if (currentQuarter == 4) { //上一个季度是第四季度,则下一年第一季度第一天
year += 1
currentQuarter = 1
} else {
currentQuarter += 1
}
let nextTime = new Date(year, currentQuarter * 3 - 2, 0, 0, 0, 0)
return nextTime
}
return quarter
};
5、获取某年某个月一共有多少天 / 最后一天 / 第一天
let year = '2022'
let month = 4
// 有多少天
let days = new Date(year,month,0).getDate() //30
// 最后一天
let lastday = new Date(year,month,0) //2022-04-30
// 第一天
let firstday = new Date(year,month-1,1) //2022-04-01
6、判断当前月份属于哪个季度
let currMonth = new Date().getMonth()+1
let currQuarter = Math.floor( ( currMonth % 3 == 0 ? ( currMonth / 3 ) : ( currMonth / 3 + 1 ) ) )
季度公式
// 1
1+(q-1)*3 or (q*3-2)
// 2
q*3-1
// 3
q*3
7、判断当前时间往前几个月份的日期
//now time 2022/08/01 14:58:40
//年(getFullYear,setFullYear)
//日(getDate,setDate)
//时(getHours,setHours())
//分秒同理
// 结果时间day小于当前时间的day时会往后推迟,如 2022-12-31 往前推迟一个月=> 2022-12-01,2022-11没有31号
let onlineTime = 1
let disMouth= new Date(new Date().setMonth((new Date().getMonth() - onlineTime))) // 2022/07/01 14:58:40
8、返回两个日期相差天数
//now time 2022/08/01
let days = ((new Date() - disMouth) / (1 * 24 * 60 * 60 * 1000))^0 //相差天数 31
9、返回第N年第N周的具体日期
/**
* n年n周返回日期
* */
function getYearWeekRange(year, weekNum) {
if (weekNum.length === 3) {
weekNum = weekNum.substring(1, 2);
} else if (weekNum.length === 4) {
weekNum = weekNum.substring(1, 3);
}
let weekDay = getDayEveryDay(year, weekNum);
if (!weekDay) {
return;
}
//返回当前日期为[年,周数,周的范围start,周的范围end],按照周五到下周四为一周
return weekDay[0] + '~' + weekDay[weekDay.length - 1];
}
function getDayEveryDay(year, index) {
let d = new Date(year, 0, 1);
let to = new Date(year, 12, 31);
if (to > new Date()) {
to = new Date();
}
let i = 0;
let arr = [];
for (let from = d; from < to;) {
if (i === index) {
arr.push(moment(from).format("YYYY-MM-DD"));
}
let j = 7 - from.getDay();
while (j > 0) {
from.setDate(from.getDate() + 1);
if (from > to) {
break;
}
if (i === index) {
arr.push(moment(from).format("YYYY-MM-DD"));
}
j--;
}
if (i === index) {
return arr;
}
from.setDate(from.getDate() + 1);
i++;
}
}