为了账号安全,请及时绑定邮箱和手机立即绑定

js 获取当前周数,并可根据周数获取日期范围

js 获取当前周数,并可根据周数获取日期范围

Zoe_z 2019-12-31 10:59:00
第一步是获取当前日期的周数(日期从1月1号 是第一周,每周是周日开始)第二步,周数是可改的,根据周数获取开始日期和结束日期。跪求,大神指点
查看完整描述

1 回答

?
橋本奈奈未

TA贡献436条经验 获得超108个赞

慕课的编辑器真的很不好用,复制过来自动把换行符去掉了。所以我就直接不用代码包裹了,自行复制到编辑器中格式化下吧。另外就是,这个代码我没怎么测,所以也不确定是否就完美实现了要求,还有这里是以周一为起点的,为了和moment的例子做比对,所以没有像题主说的用周日做起点。可以自行修改。建议可以研究下moment的实现。

//img1.sycdn.imooc.com//5e0b02570001972f13881376.jpg

//img1.sycdn.imooc.com//5e0b025700019f5211121550.jpg

/**

* 日期转周数

* @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();

}


查看完整回答
反对 回复 2019-12-31
  • 1 回答
  • 0 关注
  • 4007 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信