我正在尝试构建一个自定义日期选择器。我很难理解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月日期。
我认为您面临的问题是格式错误的日期字符串造成的(或者至少很可能是(。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")}`);