首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在dayjs中从特定的isoWeek获取天数

在dayjs中从特定的isoWeek获取天数
EN

Stack Overflow用户
提问于 2022-10-29 14:25:01
回答 1查看 120关注 0票数 0

为了创建一个每周的日历,显示给我一个星期的日子,我正在寻找一个解决方案,将这样做。输出应该显示从周一到周日从给定数据开始的天数。为了实现这一点,我在nuxt中使用了dayjs。我写了一个方法,认为到目前为止我已经完成了。然而,在我测试了不同的年份之后,情况就不是这样了。

正如在这里看到的,ISO周日期,我认为我会很好地服务于.isoWeek()

ISO周编号年(也被非正式地称为ISO年)有52周或53周.即364或371天,而不是通常的365或366天。这53个星期的年份发生在所有星期四为1月1日的年份和从星期三开始的闰年(1月1日)。额外的一周有时被称为闰周,尽管ISO 8601没有使用这个术语。

让我们看看我做了什么,问题出在哪里

代码语言:javascript
运行
复制
const year = 2022
const calendarWeek = 1 //1 to 53
代码语言:javascript
运行
复制
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 2022Sunday, 09 Jan 2022之间日期的预期结果。太好了,应该是这样的。

发现的问题:如果插入2023年的第一个日历周,将得到以下输出:

代码语言:javascript
运行
复制
const year = 2023
const calendarWeek = 1

输出:Monday, 09 Jan 2023Sunday, 15 Jan 2023之间的日期

应该是02. Jan - 08. Jan。如果我将0指定为calendarWeek,就会得到这个结果。为什么1为2022年而不是2023年工作?因此,我的日历的正确功能已经不可能了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-29 16:27:09

总之,你想要第一周,包括一年中的第一个星期一.

但实际上你得到的是一年中的第二周( week ) (isoWeek是基于零的)。

一年的第一周至少包含该年的一个日期(1月1日)。

2022年,星期一是2021年12月27日。

在这种情况下,只需比较一年,并在必要时增加7天。

我用yearweek作为参数使它成为一个函数:

代码语言:javascript
运行
复制
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))
代码语言:javascript
运行
复制
<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>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74246106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档