日期获取自定义周开始日的周数

Date get week number for custom week start day

本文关键字:周数 开始 获取 自定义 周开始 日期      更新时间:2023-09-26

如果我有一个自定义的星期开始日而不是星期一,那么getWeekNumber()原型应该如何更改Date类呢?

查找ISO周号的当前代码:

Date.prototype.getWeekNumber = function() {
    // Create a copy of this date object
    var target = new Date(this.valueOf());
    // ISO week date weeks start on monday
    // so correct the day number
    var dayNr = (this.getDay() + 6) % 7;
    // ISO 8601 states that week 1 is the week
    // with the first thursday of that year.
    // Set the target date to the thursday in the target week
    target.setDate(target.getDate() - dayNr + 3);
    // Store the millisecond value of the target date
    var firstThursday = target.valueOf();
    // Set the target to the first thursday of the year
    // First set the target to january first
    target.setMonth(0, 1);
    // Not a thursday? Correct the date to the next thursday
    if (target.getDay() !== 4) {
        target.setMonth(0, 1 + ((4 - target.getDay()) + 7) % 7);
    }
    // The weeknumber is the number of weeks between the
    // first thursday of the year and the thursday in the target week
    return 1 + Math.ceil((firstThursday - target) / 604800000); // 604800000 = 7 * 24 * 3600 * 1000
};

使用已有的函数,并添加一个可选参数weekstart,该参数指定一周从哪一天开始:0为星期日,1为星期一,依此类推。默认值为Monday。

Date.prototype.getWeekNumber = function(weekstart) {
    var target = new Date(this.valueOf());
    // Set default for weekstart and clamp to useful range        
    if (weekstart === undefined) weekstart = 1;
    weekstart %= 7;
    // Replaced offset of (6) with (7 - weekstart)
    var dayNr = (this.getDay() + 7 - weekstart) % 7;
    target.setDate(target.getDate() - dayNr + 3);
    var firstThursday = target.valueOf();
    target.setMonth(0, 1);
    if (target.getDay() !== 4) {
        target.setMonth(0, 1 + ((4 - target.getDay()) + 7) % 7);
    }
    return 1 + Math.ceil((firstThursday - target) / 604800000);
};