weekstr是字符串“年份周数”如“20201”或者“202011”,将字符串导入函数format,将“20261”和“20211”做为例子带入函数,下面2张图为2021年和2026年日历1月的图片。该方法每周从星期一到星期日规定跨年如果下年满4天为第1周,如果下年不满4天就为去年的最后一周,2026年第一周就是2025.12.29~2026.1.4,2021年第一周就是2021.1.4~2021.1.10。
//周数换成日期输入组件显示正确时间输入“20261”,“20211”
formatDay(weekstr) {
//切割字符串将年份切割出来year="2021"和year="2026"
let year = weekstr.slice(0, 4);
//切割周数weekNo="1" 和 weekNo="1"
let weekNo = weekstr.slice(4, 7);
//0-6获得输入当年1月1号的星期几,2026的1月1号是星期四,2026对应的oneday=4。2021的1月1号是星期五,2021对应的oneday=5。
let oneday = new Date(year + '-01-01').getDay();
// 方便计算,当为星期天时为7
if (oneday == 0) {
oneday = 7
}
let one_fistday;//规定第一周的第一天
let one_lastday;//规定第一周的最后一天也就是第七天
// 如果1号刚好是星期一,计算第一周的日期
if (oneday == 1) {
one_fistday = year + '-01-01'
one_lastday = year + '-01-07'
} else {
//如果1号不是星期一就分为2种情况,一种为跨年下年不满4天,则为去年的最后一周,也就是2021年这种情况,第一周为2021-1-4~2021-1-10,oneday=5。另一种为跨年满4天,也就是2026这周情况,第一周为2025-12-29~2026-1-4, oneday=4。
//if这种就是第二种情况,输入oneday=4
if (oneday < 5) {
//jj = 4
let jj = 8 - oneday
//2026年第一周的第一天one_fistday=2025-12-29,one_lastday=2026-01-04
one_fistday = (year - 1) + '-12-' + (31 + jj - 6)
one_lastday = year + '-01-' + (jj > 9 ? jj : '0' + jj)
} else {
//这种就是第一种情况,输入oneday=5
//aa =4
let aa = 9 - oneday
//2021年第一周的第一天one_fistday=2021-01-04,one_lastday=2021-01-10;
one_fistday = (year) + '-01-' + '0' + aa;
one_lastday = (year) + '-01-' + (aa + 6 < 10 ? '0' + (aa + 6) : aa + 6);
}
}
//规定fistday是输入周数的星期一,lastday是输入周数的星期日
let fistday;
let lastday;
// 如果刚好是第一周,
if (weekNo == 1) {
fistday = one_fistday
lastday = one_lastday
} else {
//计算输入周的星期一和星期日
fistday = this.addDate(one_fistday, (weekNo-1) * 7 )
lastday = this.addDate(one_lastday, (weekNo-1) * 7)
}
//输出输入周的星期一和星期日
return [fistday,lastday]
},
//计算输入周的星期一和星期日的函数
addDate(date, days) {
var d = new Date(date);
d.setDate(d.getDate() + days);
var m = d.getMonth() + 1;
return d.getFullYear() + '-' + (m > 9 ? m : '0' + m) + '-' + (d.getDate() > 9 ? d.getDate() : '0' + d.getDate());
}