【问题标题】:When you know what week it is, how to find out the start date of the week当你知道星期几时,如何找出一周的开始日期
【发布时间】:2022-12-11 06:35:23
【问题描述】:

通过“date-fns”模块,我收到了今年日期是多少周的数字。

const current = '2022-03-10'
const weekNumber = getWeek(current, 1) // 11

相反,如果你只知道数字,你想知道如何做周数的第一个日期。

我想知道的方式。

const weekNumber = 11;
const weekOfstartDate = anyFunc(weekNumber) // '2022-03-07'

你知道这个解决方案的答案吗?

【问题讨论】:

  • 那根本不可能。周1可以对应2022-01-042022-01-05甚至1994-01-04,你无法分辨是哪一个,信息丢失。
  • @Kaiido 如果我们将它限制在 2022 年是否可能?
  • 不,您无法区分构成给定一周的 7 天。
  • 你的一周是什么时候开始的?现在是星期天还是星期一?
  • @T.J.Crowder 啊,你认为这就是他们想要的吗?我的印象是他们想在那周的任何一天取回,但你可能是对的。不过,他们还需要 firstWeekContainsDate 的值,因为 2022 年 1 月 1 日实际上是 2021 年的第 51 周。

标签: javascript date date-fns


【解决方案1】:

您可以使用 I 令牌:

var dateFns = require("date-fns");
console.log(dateFns.parse('10','I', new Date()));

npm.runkit.com 返回 2022 年 3 月 7 日星期一的日期。似乎 date-fns 假定当前周的年份。我不知道如何指定年份,尝试:

console.log(dateFns.parse('2022-10','YYYY-II', new Date(),{
  useAdditionalWeekYearTokens: true
}));

抛出范围错误:格式字符串不能同时包含YYYYII。类似地,对于“2022W10”和标记“YYYY'W'II”,它表示 Y 和 I 标记不能采用相同的格式字符串。

做同样事情的函数是:

// Returns the first day (Monday) of the specified week
// Year defaults to the current local calendar year
function getISOWeek(w, y = new Date().getFullYear()) {
  let d = new Date(y, 0, 4);
  d.setDate(d.getDate() - (d.getDay() || 7) + 1 + 7*(w - 1));
  return d;
}

// Mon Mar 14 2022
console.log(getISOWeek(11).toString());
// Mon Jan 02 2023
console.log(getISOWeek(1,2023).toString());
// Mon Dec 28 2026
console.log(getISOWeek(53,2026).toString());

一个健壮的函数应该验证输入,使得周数为 1 到 53,并且 53 只允许有 53 周的年份。

【讨论】:

    【解决方案2】:

    我想要一个只使用 date-fns 函数的解决方案。这就是我组合它的方式:

    const result = setWeek(nextMonday(new Date(year, 0, 4)), week, {
        weekStartsOn: 1,
        firstWeekContainsDate: 4,
      });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 2019-11-04
      • 2019-11-21
      • 2020-03-24
      • 2011-06-27
      相关资源
      最近更新 更多