在JavaScript中,获取当前日期是本年的第几周以及本周的起始日期是一个常见的需求,特别是在日历应用或者数据分析中。下面将详细解释如何通过JS实现这个功能,并且考虑到周的起始日期可以自定义,这里设定为礼拜四开始,礼拜五结束,允许跨年和跨月。
我们来看`getWeekStartDate`函数,它的目的是获取指定日期所在周的起始日期。函数接收三个参数:year(年份)、month(月份)和day(日期)。在这里,我们首先创建一个`Date`对象`today`并设置为指定的日期。然后通过`getDay()`方法获取该日期是一周中的哪一天,返回值范围是0(周日)到6(周六)。由于我们的周从礼拜四开始,所以需要对`weekDay`进行调整。如果`weekDay`大于等于5,表示日期在周五或之后,我们需要减去`(5-weekDay)`;如果`weekDay`小于5,表示日期在周四之前,需要加上`(-2-weekDay)`。这样就能得到本周的第一天。然后通过`setDate()`方法增加相应的天数,从而得到本周的起始日期。
接着,`today.setDate(today.getDate() + 6)`用来计算本周的结束日期,即加6天后得到的日期。
接下来,我们分析`getWeekNumOfYear`函数,其任务是计算指定日期是本年的第几周。同样,函数接收年、月、日作为参数。我们先获取本年的周开始日期,也就是一年中的第一个礼拜四。这可以通过创建一个新年第一天的`Date`对象`beginDay`,然后根据`getDay()`返回的值来调整日期。如果`beginDay`是周日,那么下周四是新年第七天,所以我们把日期设置为1月7日;否则,我们从周一开始倒推到礼拜四。然后,我们将`today`设置为指定日期,计算`today`与`beginDay`之间相差的毫秒数除以一周的毫秒数(7天*24小时*60分钟*60秒*1000毫秒),向上取整,得到的就是当前日期所在的周数。需要注意的是,如果`today`正好是礼拜五,我们需要将周数加1,因为按照我们的规则,礼拜五也是新的一周的开始。
调用这两个函数`getWeekStartDate(date.getFullYear(), date.getMonth() + 1, date.getDate())`和`getWeekNumOfYear(date.getFullYear(), date.getMonth() + 1, date.getDate())`,传入当前日期对象`date`的年、月、日属性,即可获取当前日期是本年的第几周以及本周的起始日期。
总结一下,这段代码的核心思想是通过`Date`对象和数学运算来处理日期和时间,根据自定义的周规则来计算周数和周的起始日期。这种灵活性使得我们可以根据业务需求调整周的定义,适应各种应用场景。