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 月的日期。
我相信您面临的问题是日期字符串格式错误(或者至少很可能是)的结果。 getMonth
和day
都是数字,表示小于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")}`);
我正在尝试构建自定义日期选择器。我对 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 月的日期。
我相信您面临的问题是日期字符串格式错误(或者至少很可能是)的结果。 getMonth
和day
都是数字,表示小于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")}`);