【问题标题】:Set value of input type date bug设置输入类型日期错误的值
【发布时间】:2016-05-27 12:57:43
【问题描述】:

我有 2 个字段输入和输出日期。在某些情况下,我将 endDate 设置为比开始日期早 1 年。

<input type='date' id='endDate'>
$("#startDate").change(function(){
    var endDate = new Date($("#startDate").val());
    endDate.setMonth(endDate.getMonth() + 1);
    endDate.setFullYear(endDate.getFullYear() + 1);
    var myDay = ("0" + endDate.getDate()).slice(-2);
    var myMonth = ("0" + endDate.getMonth()).slice(-2);
    $("#endDate").val(endDate.getFullYear() + '-' + myMonth + '-' + myDay);
}

我将开始日期设置为 2-29-2016 时的问题 我收到以下错误:

指定值“2017-02-29”不符合要求 格式,“yyyy-MM-dd”。

我希望 Date() 函数能够处理它。显然,他们没有。这是一个错误吗?

它们是否比添加一堆 if 语句更快?

【问题讨论】:

    标签: javascript jquery html


    【解决方案1】:

    指定值“2017-02-29”不符合要求 格式,“yyyy-MM-dd”。

    2017-02-29 不是有效日期。明年(2017)的29th feb 是不可能的。

    只有闰年才有 2 月 29 日。

    改用2016-02-29

    它们是否比添加一堆 if 语句更快?

    不需要添加一堆if语句,你可以使用这个answer

    function leapYear(year)
    {
      return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
    }
    

    为了回答您的问题,如果您将日期明确设置为“2017-02-29”,则会引发错误。

    只需更改日期对象本身并将该日期对象应用于输入

      $("#endDate").val( endDate.toJSON().slice(0,10) );
    

    现在应该可以滚动到下个月了。

    编辑(基于 TJ 的评论)

    闰年除能被 100 整除的闰年(非闰年)和能被 400 整除的闰年(闰年)外,每年都会出现闰年。

    【讨论】:

    • 闰年每年都会出现能被 4 整除的除了能被 100 整除的闰年(不是闰年),除了能被 100 整除的闰年可被 400 整除(闰年)。
    • 是的,我知道这是闰年的问题。但我的问题是,Date() 函数不应该处理它吗?还是我应该手动完成?
    • @Syntax_Error 检查我更新的帖子,了解如何将更新日期设置为输入日期。让我知道这是否有效。
    【解决方案2】:

    这里真正的问题是你使用了getMonth 的值而没有加1。 getMonth 的值从 0(一月)开始,但 yyyy-MM-dd 格式的月份值从 1 开始。

    所以:

    var myMonth = ("0" + (endDate.getMonth() + 1)).slice(-2);
    // Note -------------^------------------^^^^^
    

    尽管使用了 Date 对象,但您最终还是得到了一个无效的字符串 2017-02-29,这确实可以确保它只为您提供有效的日期。 Date 对象包含日期 3 月 29 日,而不是 2 月 29 日。

    但是:

    在某些情况下,我将 endDate 设置为比开始日期早 1 年。

    您的代码没有这样做。它增加了一年一个月,而不仅仅是一年:

    endDate.setMonth(endDate.getMonth() + 1);       // <== Changing month
    endDate.setFullYear(endDate.getFullYear() + 1);
    

    如果您只想添加一年,请删除这两行中的第一行。结合更正您在形成字符串时使用getMonth 的方式,将可靠地为日期添加一年(可能会翻转月份)。

    所以:

    $("#startDate").change(function(){
        var endDate = new Date($("#startDate").val());
        endDate.setFullYear(endDate.getFullYear() + 1);
        var myDay = ("0" + endDate.getDate()).slice(-2);
        var myMonth = ("0" + (endDate.getMonth() + 1)).slice(-2);
        $("#endDate").val(endDate.getFullYear() + '-' + myMonth + '-' + myDay);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-24
      • 2015-12-15
      • 2020-01-02
      • 2019-10-04
      • 2020-03-25
      • 2021-07-30
      • 2022-12-05
      • 2019-01-27
      相关资源
      最近更新 更多