为了创建一个每周的日历,显示给我一个星期的日子,我正在寻找一个解决方案,将这样做。输出应该显示从周一到周日从给定数据开始的天数。为了实现这一点,我在nuxt中使用了dayjs
。我写了一个方法,认为到目前为止我已经完成了。然而,在我测试了不同的年份之后,情况就不是这样了。
正如在这里看到的,ISO周日期,我认为我会很好地服务于.isoWeek()
。
ISO周编号年(也被非正式地称为ISO年)有52周或53周.即364或371天,而不是通常的365或366天。这53个星期的年份发生在所有星期四为1月1日的年份和从星期三开始的闰年(1月1日)。额外的一周有时被称为闰周,尽管ISO 8601没有使用这个术语。
让我们看看我做了什么,问题出在哪里
const year = 2022
const calendarWeek = 1 //1 to 53
const dayjs = this.$dayjs
const isoWeek = require('dayjs/plugin/isoWeek')
dayjs.extend(isoWeek)
const week = dayjs().year(year).isoWeek(calendarWeek)
const startOfWeek = dayjs(week).day(1)
const weekdays = new Array(7).fill(startOfWeek).map(
(day, idx) => day.add(idx, 'day').format('dddd, DD MMM YYYY'))
这将输出Monday, 03 Jan 2022
和Sunday, 09 Jan 2022
之间日期的预期结果。太好了,应该是这样的。
发现的问题:如果插入2023年的第一个日历周,将得到以下输出:
const year = 2023
const calendarWeek = 1
输出:Monday, 09 Jan 2023
和Sunday, 15 Jan 2023
之间的日期
应该是02. Jan
- 08. Jan
。如果我将0
指定为calendarWeek
,就会得到这个结果。为什么1
为2022年而不是2023年工作?因此,我的日历的正确功能已经不可能了。
发布于 2022-10-29 16:27:09
总之,你想要第一周,包括一年中的第一个星期一.
但实际上你得到的是一年中的第二周( week ) (isoWeek
是基于零的)。
一年的第一周至少包含该年的一个日期(1月1日)。
2022年,星期一是2021年12月27日。
在这种情况下,只需比较一年,并在必要时增加7天。
我用year
和week
作为参数使它成为一个函数:
function getWeekOfYear(year, week) {
// The first monday of the first week includes at least one day of the year
let firstMondayOfYear = dayjs().year(year).isoWeek(week).day(1);
console.log("Monday 1:", firstMondayOfYear.format("dddd, DD MMM YYYY"));
// Now make sure it really is the first monday of the year
if (firstMondayOfYear.year() !== year) {
firstMondayOfYear = firstMondayOfYear.add(7, "days");
}
console.log("Monday 2:", firstMondayOfYear.format("dddd, DD MMM YYYY"));
// return the week for that "real" first monday of the year
return new Array(7)
.fill(firstMondayOfYear)
.map((day, idx) => day.add(idx, "day").format("dddd, DD MMM YYYY"));
}
console.log("result for 2022 - week 0", getWeekOfYear(2022, 0))
console.log("result for 2023 - week 0", getWeekOfYear(2023, 0))
console.log("result for 2022 - week 52", getWeekOfYear(2022, 52))
<script src="https://cdnjs.cloudflare.com/ajax/libs/dayjs/1.11.6/dayjs.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/dayjs/1.11.6/plugin/isoWeek.min.js"></script>
<script>
dayjs.extend(window.dayjs_plugin_isoWeek)
</script>
https://stackoverflow.com/questions/74246106
复制相似问题