获取一年的周号,其中周号从1月1日开始

时间:2019-07-26 01:20:21

标签: javascript date week-number

我有以下代码来获取日期时的星期数

Date.prototype.getWeek = function () {
        var d = new Date(Date.UTC(this.getFullYear(), this.getMonth(), this.getDate()));
        d.setUTCDate(d.getUTCDate() - d.getUTCDay());
        var yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));
        return Math.ceil((((d - yearStart) / 86400000) + 1) / 7);
    }

当我通过日期2018年1月1日时,在2017年的最后一周是2018年1月1日,则将number设置为53。如何通过将年份从1月1日开始而不是每周的开始日期是星期天吗?

1 个答案:

答案 0 :(得分:0)

您可以使用UTC日期值计算自1月1日以来的整周数,以避免夏时制问题。从1月1日之前的1毫秒开始,使用 Math.ceil 表示1月1日是第1周的第一天。

以下是对代码的轻微重构:

// Get week number based on start of 1 Jan
function getWeekNumber(date = new Date()) {
  const msPerWeek = 5.828e8;
  // Use UTC values to remove timezone issues
  let d = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()));
  // Set epoch to 1 ms before 1 Jan
  let e = new Date(Date.UTC(d.getUTCFullYear(), 0, 0, 23, 59, 59, 999));
  // Return week number
  return Math.ceil((d - e) / msPerWeek);
}

[new Date(2019,0,1),  // Tue 1 Jan, week 1
 new Date(2019,0,7),  // Mon 7 Jan, week 1
 new Date(2019,0,8),  // Tue 8 Jan, week 2
 new Date(2019,0,15), // Tue 15 Jan, week 3
 new Date()           // Today
].forEach( date => console.log(date.toDateString() + ': ' + getWeekNumber(date)));