js 获取一段时间、两个日期间的所有日期(天数)、所有月份、所有年份

一段时间

// 现在的时间
let now = new Date();
// 近一周
let date1 = new Date(now.getTime() - (1000 * 60 * 60 * 24 * 7));
// 近30天
let date2 = new Date(now.getTime() - (1000 * 60 * 60 * 24 * 30));
// 近半年
let date3 = new Date(now.getTime() - (1000 * 60 * 60 * 24 * 180));
// 近一年
let date4 = new Date(now.getTime() - (1000 * 60 * 60 * 24 * 365));

gettime(date){
    let Y = date.getFullYear() + '-';
    let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
    let D = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
    return Y + M + D
},

console.log(this.gettime(now))
console.log(this.gettime(date1))
console.log(this.gettime(date2))
console.log(this.gettime(date3))
console.log(this.gettime(date4))

获取一段时间之间的所有天数

 function getDateBetween(start, end) {
        var result = [];
        //使用传入参数的时间
        var startTime = new Date(start);
        var endTime = new Date(end);
        while (endTime - startTime >= 0) {
            let year = startTime.getFullYear();
            let month = startTime.getMonth();
            month = month<9?'0'+(month+1):month+1;
            let day = startTime.getDate().toString().length == 1 ? "0" + startTime.getDate() : startTime.getDate();
            //加入数组
            result.push(year + "-" + month + "-" + day);
            //更新日期
            startTime.setDate(startTime.getDate() + 1);
        }
    return result;
}


测试结果:
console.log(getDateBetween('2020-9-12','2020-10-28'));

获取一段时间之间的所有的月份

function getMonthBetween(start,end){  
        //初始化数组
            var result = [];  
        //切割起始年月
            var s = start.split("-");  
        //切割结束年月
            var e = end.split("-");  
        //获取时间对象
            var min = new Date();  
            var max = new Date();  
        //设置起始时间
            min.setFullYear(s[0],s[1]);  
        //设置结束时间
            max.setFullYear(e[0],e[1]);  
        
        //复制一份起始时间对象
            var curr = min;  
        //定义字符串
        var str = "";
        //起始时间在结束时间之前
            while(curr <= max){  
            //获取此时间的月份
                var month = curr.getMonth();  
            //如果月份为0,也就是代表12月份
            if(month===0){
                str=(curr.getFullYear()-1)+"-"+12;
            }else{//正常月份
                str=curr.getFullYear()+"-"+(month<10?("0"+month):month);
            }
            //将此年月加入数组
                result.push(str);  
            //更新此时间月份
                curr.setMonth(month+1);  
            }  
            return result;  
 }  

测试结果:
console.log(getMonthBetween('2018-09','2020-02'));

获取一段时间之间的所有的年份

function getYearBetween(start,end){
        var result = [];
        //使用传入参数的时间
        var startTime = new Date(start);
        var endTime = new Date(end);
        while(endTime - startTime>=0 ) {
            //获取年份
            let year = startTime.getFullYear();
            //加入数组
            result.push(year);
            //更新日期
            startTime.setFullYear(startTime.getFullYear()+1);
        }
    return result;
}

测试结果:
console.log(getYearBetween('2017','2020'));

按月份对事件数组进行排序

const
    MONTHS = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC'],
    events = [{ event: 'prom', month: 'MAY' }, { event: 'graduation', month: 'JUN' }, { event: 'dance', month: 'JAN' }];

events.sort((a, b) => MONTHS.indexOf(a.month) - MONTHS.indexOf(b.month));

console.log(events);

如果有时没有month属性或值与给定月份不同,则可以添加一个默认值,将此项移动到顶部(0)或底部({%13}或大于数组长度的值)。

const
    MONTHS = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC'],
    events = [{ event: 'prom', month: 'MAY' }, { event: 'party', month: '' }, { event: 'graduation', month: 'JUN' }, { event: 'dance', month: 'JAN' }];

events.sort((a, b) =>
    (MONTHS.indexOf(a.month) + 1 || Number.MAX_VALUE) -
    (MONTHS.indexOf(b.month) + 1 || Number.MAX_VALUE)
);

console.log(events);

将带T的时间转换为北京时间格式

2023-09-25T01:45:05.000+00:00

export function utc2beijing(utc_datetime) {
	// 转为正常的时间格式 年-月-日 时:分:秒
	let T_pos = utc_datetime.indexOf('T');
	let Z_pos = utc_datetime.indexOf('Z');
	let year_month_day = utc_datetime.substr(0,T_pos);
	let hour_minute_second = utc_datetime.substr(T_pos+1,Z_pos-T_pos-1);
	let new_datetime = year_month_day+" "+hour_minute_second; // 2017-03-31 08:02:06

	// 处理成为时间戳
	timestamp = new Date(Date.parse(new_datetime));
	timestamp = timestamp.getTime();
	timestamp = timestamp/1000;

	// 增加8个小时,北京时间比utc时间多八个时区
	let timestamp = timestamp+8*60*60;

	// 时间戳转为时间
	let beijing_datetime = new Date(parseInt(timestamp) * 1000).toLocaleString().replace(/\//g,"-").replace(/上午|中午|下午|晚上/g, " ");

	return beijing_datetime;  // 2023-09-25 8:00:00
}