【问题标题】:JavaScript setDate returning wrong datesJavaScript setDate 返回错误的日期
【发布时间】:2011-07-26 17:45:57
【问题描述】:

我从字符串中获取日期,解析它以获取日、月和年的组成部分,并使用它们来实例化 Date 对象。

我想要实现的是将日期增加一天。 除了 setDate 方法有时坚持返回无效日期外,一切都很好......

例如,如果我将 1 天添加到 2011 年 2 月 28 日,它将返回 2011 年 2 月 29 日...实际上不存在的日期。

这是 JavaScript 原生日期/时间 API 的错误/限制,还是我做错了什么?如果不检查日期的有效性,我很难相信它的行为方式。

 var myDate = new Date(2011, 2, 28);
 alert(myDate);
 myDate.setDate(myDate.getDate() + 1);
 alert(myDate); // 29 February 2011 !

谢谢。

【问题讨论】:

    标签: javascript date


    【解决方案1】:

    你不在二月 - 第 2 个月是三月

    JS 月份是从 0 开始的

     var myDate = new Date(2011, 1, 28); // 28th of Feb
     alert(myDate);
     myDate.setDate(myDate.getDate() + 1);
     alert(myDate); // 1st of March 2011 !
    

    PS:如果您使用 var d = new Date() 创建日期并且之后不通过 d.setHours(0,0,0,0) 将时间标准化

    ,那么在夏令时期间您可能会遇到一些问题

    【讨论】:

    • 我现在明白了,非常感谢。我来自 .Net 背景,而 DateTime 对象在其中的行为并非如此......我怀疑我做错了什么......虽然不能说我觉得这种行为非常直观,尽管大多数事情在编程中是从0开始的。
    • 更不直观的是,年份和日期部分似乎不是从0开始的......
    • @Kharlos - 天数也是基于 0 - 0 = 星期日 - 其中之一 - 更多信息在这里:Why is January month 0 in Java Calendar ?
    • 天数改为基于 1。这是什么政策?
    • 我不明白你的问题
    【解决方案2】:

    不,您使用的是 March,不是吗?存在 3 月 29 日。

    var myDate = new Date(2011, 1, 28); // 28th of february
    

    【讨论】:

      【解决方案3】:

      你忘了,它从 0 开始计算月份。 var myDate = new Date(2011, 2, 28); 实际上是 2011 年 3 月 28 日星期一 00:00:00 GMT+0300(FLE 夏令时间){}

      试试

       var myDate = new Date(2011, 1, 28);
       alert(myDate);
       myDate.setDate(myDate.getDate() + 1);
       alert(myDate); // 1 Mar 2011 !
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-24
        • 1970-01-01
        相关资源
        最近更新 更多