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



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

基本上,我创建一个日期,获取一个月中的天数,并使用有效的日期字符串创建Date对象,以便使用该数字进行显示/处理。

在某些月份(根据我的测试,月份#>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")}`);

相关内容

  • 没有找到相关文章

最新更新