如何计算两周选择器之间的周数
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-W01
和2021-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-fns
和differenceInCalendarWeeks
。
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
)
我创建了两个星期选择器(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-W01
和2021-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-fns
和differenceInCalendarWeeks
。
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
)