如何计算两周选择器之间的周数

How to calculate the amount of weeks between two week pickers

我创建了两个星期选择器(html 输入类型 =“星期”)。我想知道这两周 selected 之间相隔了多少周。这是我的两个 html 周选择器:

<input type="week" id="weekPicker1" required="required" min="1971-W01" max="2071-W52" value="2021-W01">
<input type="week" id="weekPicker2" required="required" min="1971-W01" max="2071-W52" value="2021-W52">

它将returns2021-W012021-W52作为一个字符串。

在这种情况下,日期之间有 52 周。但是我怎样才能让 Javascript 也知道这一点呢?

我有这个 Javascript 代码来确保我得到年和周的数字:

// Get dates in usable format.
let startDate = inputFields[0].value.split("-");
let startYear = Number(startDate[0]); //2021
let startWeek = Number(startDate[1].replace("W", "")); //1

let endDate = inputFields[1].value.split("-");
let endYear = Number(endDate[0]); //2021
let endWeek = Number(endDate[1].replace("W", "")); //52

但是现在,我该如何计算呢?

我想到了这个:

var yearDiff = endYear - startYear;
var amountOfWeeks = endWeek - startWeek;

amountOfWeeks += yearDiff * 52;

我认为它几乎可以工作,除了不是每年都有 52 周(闰年)。那么我应该如何有效地做到这一点呢?

编辑:

我想在纯 JS 中看到它。没有图书馆或类似的东西。我想要基于像 this 这样的日历的周数。所以基于一周 7 天的计算不会给出我想要的。

最后我需要用星期来计算。所以使用日期选择器 select 周似乎仍然是错误的。我还测试了我是否可以根据天数等进行计算,但它会给出错误的结果。我必须做的计算:(selected 周长):(一年中的最大周数)* 200.

使用date-fnsdifferenceInCalendarWeeks

const result = differenceInCalendarWeeks(
  startDate,
  endDate
)

一年有 52 周 + 1 天,闰年有 52 周 + 2 天。所以你的建议 amountOfWeeks += yearDiff * 52; 似乎不准确。下面的函数将开始和结束的年份和周数转换为毫秒,减去并转换回周数。它应该适用于闰年。不过我还没有测试过。

function compareWeeks(startYear, startWeek, endYear, endWeek) {
    
    const start =
        new Date(startYear, 0).getTime() + startWeek * 7 * 24 * 60 * 60 * 1000

    const end = 
        new Date(endYear, 0).getTime() + endWeek * 7 * 24 * 60 * 60 * 1000

    const diff = Math.abs(end - start)
    const diffWeeks = diff / 1000 / 60 / 60 / 24 / 7
    return diffWeeks
}

更新 ISO 周编号年份(您的用例):
根据 wikipedia,一个 ISO 年有 52 或 53(ISO 闰年)周。 53 当它以 Thirsday else 52 开始或结束时。查看以下代码:

function weeksInBetween(startYear, startWeek, endYear, endWeek) {
    let diff = 0
    for (let i = startYear; i < endYear; i++) {
        const has53Weeks = isISOLeapYear(i)
        if (has53Weeks) {
            diff += 53
        } else {
            diff += 52
        }
    }

    return (diff += endWeek - --startWeek)
    /* 
        the '--startWeek' makes sure the starting week
        is not subtracted from the result, because you
        want the result to be inclusive'
        
    */
}

function isISOLeapYear(year) {
    const startsWithThursday =
        new Date(year, 0, 1).toString().split(' ')[0] === 'Thu'
    const endsWithThursday =
        new Date(year, 11, 31).toString().split(' ')[0] === 'Thu'

    if (startsWithThursday || endsWithThursday) {
        return true
    }

    return false
}

console.log(
    weeksInBetween(2020, 1, 2021, 52), // 105
    weeksInBetween(2009, 1, 2010, 52), // 105
    weeksInBetween(2021, 1, 2021, 52), // 52
    weeksInBetween(2021, 1, 2022, 52), // 104
    weeksInBetween(2021, 1, 2021, 1)   // 1
)