【问题标题】:Is there a way to prevent the Date object in JS from overflowing days/months? [duplicate]有没有办法防止 JS 中的 Date 对象溢出天/月? [复制]
【发布时间】:2020-03-19 14:17:04
【问题描述】:

我有一个程序以 dd.mm.yyyy 格式从用户输入中获取日期。

但是,当输入错误的日期时,例如 30.02.2020,天数溢出并将月份设置为 3。我宁愿能够告诉用户该日期是不可能的。有没有办法在js中做到这一点?

【问题讨论】:

标签: javascript date


【解决方案1】:

没有任何方法可以让Date 对象做到这一点,不。您必须在 Date 对象之外处理它。

一种相当简单的方法是在构造后检查字段:

const parts = /^(\d+)\.(\d+)\.(\d+)$/;
if (parts) {
    const day = +parts[1];
    const month = +parts[2] - 1;
    const year = +parts[3];
    const dt = new Date(year, month, day);
    if (dt.getFullYear() !== year || dt.getMonth() !== month || dt.g etDate() !== day) {
        // overflow
    }
}

或者在具有命名捕获组的最新环境中:

const parts = /^(?<day>\d+)\.(?<month>\d+)\.(?<year>\d+)$/;
if (parts) {
    const day = +parts.groups.day;
    const month = +parts.groups.month - 1;
    const year = +parts.groups.year;
    const dt = new Date(year, month, day);
    if (dt.getFullYear() !== year || dt.getMonth() !== month || dt.g etDate() !== day) {
        // overflow
    }
}

【讨论】:

  • 我不敢相信我没有想到这一点。谢谢,你会在几分钟内得到你的复选标记! :)
  • 确定只需要检查月份是否因溢出而不同?如果日期或年份不同,月份也会不同?
  • @52d6c6af - 仅当您将天数限制为两位数时。 :-)(考虑new Date(2020, 2, 365))我倾向于防御性编程......
猜你喜欢
  • 2012-09-24
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多