函数根据语句的顺序返回不正确的月份

时间:2017-05-31 23:25:48

标签: javascript date

有没有人想过为什么会发生这种情况?今天,我发现我写的日期转换函数开始返回错误的月份。例如,在尝试转换&#34; 2017-06-02 &#34;到&#34; 2017年6月2日星期五00:00:00 GMT-0600(山区夏令时)&#34;,它实际返回 7月 而不是< / strong> 六月。当我重新安排函数中某些语句的顺序时,最终返回了正确的日期。这段代码已经存在了好几个月,所以这是自发的...可能是由于当前月份的变化,今天是5/31/17?这可能只会在今天或月末运行时被破坏? (我确定有更好的方式来转换日期,但无论如何这里都是有问题的代码):

<!doctype html>

<body onload="testDate()">

    <div id="resultbad"></div>
    <div id="resultgood"></div>

    <script>

        function testDate() {

            document.getElementById("resultbad").innerHTML = "Bad Result: Converting 2017-06-02 returns: " + badDate("2017-06-02");
            //returns: Bad Result: Converting 2017-06-02 returns: Sun Jul 02 2017 00:00:00 GMT-0600 (Mountain Daylight Time)

            document.getElementById("resultgood").innerHTML = "Good Result: Converting 2017-06-02 returns: " + goodDate("2017-06-02");
            //returns: Good Result: Converting 2017-06-02 returns: Fri Jun 02 2017 00:00:00 GMT-0600 (Mountain Daylight Time)

        }


        function badDate(d) {

            var td = d.split('-'); 

            var nd = new Date(); 

            //originally ordered:  Year, Month then Day
            nd.setFullYear(td[0]);
            nd.setMonth(td[1] - 1); 
            nd.setDate(td[2]); 

            //set time
            nd.setHours(0); 
            nd.setMinutes(0,0,0); 
            return nd; 

        }

        function goodDate(d) {

            var td = d.split('-'); 

            var nd = new Date(); 

            //new order:  Day, Month then Year
            nd.setDate(td[2]); 
            nd.setMonth(td[1] - 1); 
            nd.setFullYear(td[0]);

            //set time
            nd.setHours(0); 
            nd.setMinutes(0,0,0); 
            return nd; 

        }

    </script>


</body>

2 个答案:

答案 0 :(得分:3)

此代码会根据今天的日期覆盖日期元素。因此,如果您在该月的第31天运行代码,则此代码的“错误”版本将首先覆盖该月,如果该月仅有30天,则将转到下个月。

基本上,在setMonth之后但在setDate之前,您正尝试创建2017年6月31日的日期,JS将为您转换为2017年7月1日。

相反,请将此作为一个电话:

新日期(td [0],td [1] -1,td [2],0,0,0,0)

答案 1 :(得分:1)

你很好地解决了这个问题 - 它与今天的第31个月有关。

问题是new Date()创建了一个填写了字段的日期对象。然后,您将逐个更改这些字段。

所以现在我们可以把它想象成这样的伪结构,记住那个月是从0开始的:

{
  year: 2017
  month: 4
  date: 31
}

当您致电setMonth()时,您只是更改月份字段,因此您认为6月会将其设置为

{
  year: 2017
  month: 5
  date: 31
}

但它知道6月份没有31天。 6月的第31个“日”将是7月1日。所以它可以帮助你将其调整到

{
  year: 2017
  month: 6
  date: 1
}

然后,您使用setDate()将日期设置为第二个:

{
  year: 2017
  month: 6
  date: 2
}

在有效的功能中,您将在月份之前设置日期,因此如果您指定的日期大于该月的天数,则不会重新计算当天的日期