需求介绍
给一个年份和第几周,计算出这周是从几号到几号
规则
一年分为54周,第一周是1月1日到第一个周日,第二周是今年的第一个周一往后推一周,以此类推,第53周的时候如果没到12月31日,则该年度有54周,反之有53周,到12月31日不管是不是周末,都截止到最后一周的结束日期
代码详解
//时间戳转年月日 参数是秒的时间戳 函数返回一个对象 对象里有年 月 日
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 日不论是周几,都算为本周的最后一天
//参数年份 ,函数返回一个数组,数组里的对象包含 这一周的开始日期和结束日期
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
}
//例如 2012 年就跨了54周,也有很多是53周的
let week2012 = whichWeek(2012)
console.log(week2012)
//调用完得到的是一个数组见下图
然后需要哪一周的起始时间,直接用索引在数组里取就好了
javascript