获取周数从 1 月 1 日开始的年份的周数



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

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-01-01 时,周数为 53,因为 2018 年 1 月 1 日位于 2017 年的最后一周。如何通过将年份从 1 月 1 日开始而不是将每周的开始日期设为星期日来获取周数?

您可以使用

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)));

最新更新