1 回答
TA贡献436条经验 获得超108个赞
慕课的编辑器真的很不好用,复制过来自动把换行符去掉了。所以我就直接不用代码包裹了,自行复制到编辑器中格式化下吧。另外就是,这个代码我没怎么测,所以也不确定是否就完美实现了要求,还有这里是以周一为起点的,为了和moment的例子做比对,所以没有像题主说的用周日做起点。可以自行修改。建议可以研究下moment的实现。
/**
* 日期转周数
* @example
* date2Week()
* // => 52
* date2Week('2019-12-30')
* // => 1
* date2Week('2019-12-29')
* // => 52
* date2Week('2019-01-01')
* // => 1
* date2Week('2019-01-07')
* // => 2
* @param {string?} str 时间字符串
* @return {number} 周数
*/
function date2Week(str) {
// 获取date,不传则默认为当前date,这里没有做时间格式校验
var d = str ? new Date(str) : new Date();
// start为1/1对应的date【0时0分】
var start = new Date(d.getFullYear() + '/01/01');
// end 为当前date【0时0分】
var end = new Date(d.toLocaleDateString());
// 天数差 【上面的0时0分意在避免影响天数的计算】
var dayOffset = (end - start)/1000/60/60/24;
// 以周一为一周起点,故而需要加上元旦时的偏移量
var base = dayOffset+start.getDay();
return (
dayOffset ?
base/7 > 52 ?
dayOffset%7+start.getDay() ? 1 : 52 :
Math.ceil(base/7) :
1
);
}
/**
* 周数转日期范围
* @example
* week2DateRange(52)
* // => "2019/12/23~2019/12/29"
* week2DateRange(51)
* // => "2019/12/16~2019/12/22"
* week2DateRange(1)
* // => "2018/12/31~2019/1/6"
* week2DateRange(2)
* // returns "2019/1/7~2019/1/13"
* week2DateRange(1,'2020')
* // => "2019/12/31~2020/1/6"
* @param {number} num 周数
* @param {date?} [date] 指定日期
* @return {string} 周数的日期范围
*/
function week2DateRange(num,date) {
if(num < 1 || num > 52) return RangeError('周数必须符合:0<num<53');
// 接受浮点数,但做取整处理。
num = num|0;
var d = date ? new Date(date) : new Date();
var start = new Date(d.getFullYear() + '/01/01');
// 当前的date[0时0分]
var now = new Date(start.getTime() + (num-1)*7*24*60*60*1000);
// 当前周的周一date,用当前毫秒减去偏差的毫秒
var begin = new Date(now.getTime() - (now.getDay()-1)*60*60*1000);
// 在得出周一的date后,周日的date即可以通过setDate的方式直接设置即可
var finish = new Date(begin);
finish.setDate(begin.getDate()+6);
return begin.toLocaleDateString() + '~' + finish.toLocaleDateString();
}
添加回答
举报