js关于日期的算法

3 篇文章 0 订阅
  1. 获取当前周数
  2. 判断年份是否为润年
  3. 获取某年某月的天数
  4. 计算两个日期差几天
  5. 周获取对应的日期
  • 给一个年份和第几周,计算出这周是从几号到几号
  1. 计算环比日期
/**
* 获取当前周数
*/
export function getWeekNumber(y, m, d) {
    var targetDay = new Date(y, m - 1, d);
    var year = targetDay.getFullYear();
    var month = targetDay.getMonth();
    var days = targetDay.getDate();
    //那一天是那一年中的第多少天
    for (var i = 1; i < m; i++) {
        days += getMonthDays(year, i);
    }
    //那一年第一天是星期几
    var yearFirstDay = new Date(year, 0, 1).getDay();
    //计算是第几周   - 1 从周一开始算
    days += yearFirstDay - 1;
    var week = Math.ceil(days / 7);
    return week;
}

/**
 *判断年份是否为润年
 */
function isLeapYear(year) {
    return (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
}
/**
 *获取某年某月的天数
 */
export function getMonthDays(year, month) {
    return [31, (isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month - 1];
}

/**
 * 计算两个日期差几天
 * @param sDate1
 * @param sDate2
 * @returns {number}
 * @constructor
 */
export function computation(sDate1,  sDate2){    //sDate1和sDate2是2002-12-18格式
    var  aDate,  oDate1,  oDate2,  iDays
    aDate  =  sDate1.split("-")
    oDate1  =  new  Date(aDate[1]  +  '-'  +  aDate[2]  +  '-'  +  aDate[0])    //转换为12-18-2002格式
    aDate  =  sDate2.split("-")
    oDate2  =  new  Date(aDate[1]  +  '-'  +  aDate[2]  +  '-'  +  aDate[0])
    iDays  =  parseInt(Math.abs(oDate1  -  oDate2)  /  1000  /  60  /  60  /24)    //把相差的毫秒数转换为天数
    return  iDays;
}


/**
 * 周获取对应的日期
 * 给一个年份和第几周,计算出这周是从几号到几号
 * 一年分为54周,第一周是1月1日到第一个周日,第二周是今年的第一个周一往后推一周,以此类推,第53周的时候如果没到12月31日,则该年度有54周,反之有53周,到12月31日不管是不是周末,都截止到最后一周的结束日期
 * @param long
 * @returns {{date: *, month: *, year: number}}
 */
//例如 2012 年就跨了54周,也有很多是53周的
//let week2012 = whichWeek(2012)
//console.log(week2012)
//调用完得到的是一个数组,取对应周即可
//时间戳转年月日  参数是秒的时间戳 函数返回一个对象 对象里有年 月 日
function yearDay(long){
    var time = new Date(long * 1000)
    var year = time.getFullYear();
    var month = (time.getMonth()+1) < 10 ? '0' + (time.getMonth()+1) : (time.getMonth()+1);
    var date = time.getDate() < 10 ? '0' + time.getDate() : time.getDate() ;
    var yearday = {year,month,date}
    return yearday
}
//计算一年中的每一周都是从几号到几号
//第一周为1月1日到 本年的 第一个周日
//第二周为 本年的 第一个周一 往后推到周日
//以此类推 再往后推52周。。。
//如果最后一周在12月31日之前,则本年有垮了54周,反之53周
//12月31 日不论是周几,都算为本周的最后一天
//参数年份 ,函数返回一个数组,数组里的对象包含 这一周的开始日期和结束日期
export function whichWeek(year){
    var d = new Date(year, 0, 1);
    while (d.getDay() != 1) {
        d.setDate(d.getDate() + 1);
    }
    let arr = []
    let longnum = d.setDate(d.getDate())
    if(longnum > +new Date(year, 0, 1)){
        let obj = yearDay(+new Date(year, 0, 1) / 1000)
        obj.last = yearDay( longnum / 1000 - 86400)
        arr.push(obj)
    }
    let oneitem = yearDay(longnum / 1000)
    oneitem.last = yearDay( longnum / 1000 + 86400 * 6)
    arr.push(oneitem)
    var lastStr
    for(var i = 0 ; i<51 ;i++){
        let long = d.setDate(d.getDate() + 7)
        let obj = yearDay( long / 1000)
        obj.last = yearDay( long / 1000 + 86400 * 6)
        lastStr = long + 86400000 * 6
        arr.push(obj)
    }
    if(lastStr < +new Date(year + 1, 0, 1)){
        let obj = yearDay(lastStr / 1000 + 86400)
        obj.last = yearDay(+new Date(year + 1, 0, 1) / 1000 - 86400)
        arr.push(obj)
    }else{
        arr[arr.length-1].last = yearDay(+new Date(year + 1, 0, 1) / 1000 - 86400)
    }
    return arr
}


/**
 *计算环比日期
 */
export function chainRatio(time){
	let result = [];
	//获取间隔天数
	let dayNum = (new Date(time[1]) - new Date(time[0])) / 1000 / 3600 / 24;
	let startDate = new Date(time[0]);
	startDate = new Date(startDate.getTime() - (1000 * 3600 * 24 * dayNum));
	startDate = startDate.getFullYear()+"-"+(startDate.getMonth()+1)+"-"+startDate.getDate();
	result.push(startDate + " 00:00:00");
	let endDate = new Date(time[0]);
	endDate = new Date(endDate.getTime() - (1000 * 3600 * 24 * 1));
	endDate = endDate.getFullYear()+"-"+(endDate.getMonth()+1)+"-"+endDate.getDate();
	result.push(endDate + " 23:59:59");
	return result;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值