JS 日期创建不正确的 dates/JS 日期混淆

JS Date creating incorrect dates/JS Date confusion

我正在尝试构建自定义日期选择器。我对 JS Date 的理解很挣扎,但是我需要帮助来确定差距。我在尝试使用 for 循环创建日期时遇到了一些奇怪的事情!

基本上我会创建一个日期,获取一个月中的天数,然后使用 valid date string 创建 Date 个对象,使用该数字 display/processing。

对于某些月份(根据我的测试,月份 # > 9),第 9 天重复,因此整数 10 没有进入日期。其余日期创建时间落后1。

代码:

export const MinimalDatepicker = () => {
  // grab an arbitrary date for further use
  const today = new Date('2022-11-01');
  console.log('Month:', today.getMonth() + 1);
  const daysInCurrentMonth = getDaysInMonth(today);
  const daysToShow: Date[] = [];
  Array.from(Array(daysInCurrentMonth).keys()).map((day) => {
    const date = new Date(`${today.getFullYear()}-${today.getMonth() + 1}-${day + 1}`);
    daysToShow.push(date);
  });
  console.log(daysToShow.map((d) => d.getDate()))

  return (
    <div>stuff</div>
  );
};

月 # > 9 的输出日志 - 注意重复项 9 - 最后一天应该是 31,而不是 30:

Month: 10
[1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]

如果我们将月份回滚到 10,我们会发现问题不再发生:

Month: 9
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]

更混乱

我知道在 JS Date 中,月份索引从零开始,所以我使用 date.getMonth() + 1 来“准确”代表我当前的月份,但我不确定它有多准确。

在我的 2022-11-01 日期字符串示例中,当我调用 .getMonth() 时,我实际上收到的日期是字符串中使用的数字后面的 2 个整数;在上面的日志中,2022-11-01 在日志中产生了 9 + 1 的月份,这样 2022-01-01 实际上产生了 12 月的日期。

我相信您面临的问题是日期字符串格式错误(或者至少很可能是)的结果。 getMonthday都是数字,表示小于10时为单个字符串。 2022-1-1 不是 JS 解析的有效日期。 padStart 可以帮助正确格式化。

尝试:

const date = new Date(`${today.getFullYear()}-${String(today.getMonth() + 1).padStart(2, "0")}-${String(day + 1).padStart(2, "0")}`);