JS 返回两个时间之间的所有日期、月份、年份、季度

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

在这里插入图片描述
参考:JavaScript Date 对象

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++;
    }
}
  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值