gpt4 book ai didi

javascript - new Date() 在 JavaScript 中表现不一致

转载 作者:行者123 更新时间:2023-11-28 03:30:03 26 4
gpt4 key购买 nike

我有一个由 3 个下拉列表组成的 JavaScript 控件,用于收集用户的出生日期(不要问我为什么我们不使用日期选择器)日、月和年的下拉菜单。当所有 3 个下拉列表都选择了一个值时,我会收集这些值并构造一个日期:

  var d = new Date(Date.UTC(this.selectedYear, this.selectedMonth - 1, this.selectedDay));

我不确定为什么需要从月份中减去 1,我只是从现有代码库中复制了该位,它似乎有效。我猜无论出于何种原因,月份都有一个从零开始的索引。

这些下拉列表的明显问题是用户可以选择无效日期。没有什么可以阻止他们选择 31 日,然后选择二月。这将导致日期向前移动几天,即值 1999, 2, 31,将为我提供 1999 年 3 月 3 日。所以我有一个支票:

if (d.getDate() != this.selectedDay) {
d = new Date(Date.UTC(this.selectedYear, this.selectedMonth - 1, 0));
this.selectedDay = d.getDate();

如果月份中的某一天与我的原始值不同,则意味着日期已发生变化,因此我将日期更改为上个月的最后一天(因此 0 代表天),然后更新 '天的下拉菜单。

奇怪的是,我无法在第二次转换中执行 this.selectedMonth - 1 。这会让我回到 1 月 31 日。所以我必须执行以下操作:

 var d = new Date(Date.UTC(this.selectedYear, this.selectedMonth - 1, this.selectedDay));
if (d.getDate() != this.selectedDay) {
d = new Date(Date.UTC(this.selectedYear, this.selectedMonth, 0));
this.selectedDay = d.getDate();
}

这确实有效,但对我来说却令人难以置信。如果我使用 0 作为天数而不是一个月中的有效日期,为什么月份的表现会有所不同?为什么有人会以这种方式实现它?有谁能给出一个合理的解释吗?

最佳答案

实际上,month 字段与其他字段没有任何不同:day 部分是唯一索引为 1 的字段,如您所见在 the docs on Date :

Given at least a year and month, this form of Date() returns a Date object whose component values (year, month, day, hour, minute, second, and millisecond) all come from the following parameters. Any missing fields are given the lowest possible value (1 for the day and 0 for every other component).

(强调我的)

<小时/>

您做出的错误假设是,使用 0 作为 day 部分将表示该月的最后一天。 JS Date 没有这样的怪癖!

选择日期0,而不是日期1,只会将您选择的日期偏移one天。距离该月的第一天只有一整天...
那将是上个月的最后一天。

<小时/>

如果您要选择的月份是 this.selectedMonth - 1,则通过执行以下操作获取其最后一天:

  • 选择下个月 - 即 + 1,因此:(this.selectedMonth - 1) + 1
  • 返回第一天的前一天 - 即 0 天,1 之前的一天。

这正是您离开时正在做的事情:

//                ┌───── year ────┐  ┌───── month ────┐ day
new Date(Date.UTC(this.selectedYear, this.selectedMonth, 0))
// │ │ │
// ┌─────────────────────┘ │ │
// the month after (this.selectedMonth - 1) │
// │
// ┌──────────────────────────────┤
// the day before the first day (1)

有时,即使是一张 ASCII 图片也比一千个单词更有值(value) 🙂。

关于javascript - new Date() 在 JavaScript 中表现不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58261162/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com