功能根据语句顺序返回不正确的月份



有人对为什么会发生这种情况有任何想法吗?今天,我发现我写的日期转换功能开始返回错误的月份。例如,尝试转换" 2017-06-02 "为" fri fri JUN 02 2017 00:00 00:00 gmt-0600(山日光时间(实际返回 7月而不是 June 。当我重新安排功能中某些语句的顺序时,最终返回了正确的日期。该代码已经存在了许多月,所以这种自发的……也许是由于当前月的变化,因为今天是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>

此代码根据今天的日期覆盖日期元素。因此,如果您在一个月的31天运行代码,则该代码的"不良"版本将首先覆盖本月,如果该月只有30天,它将延长到下个月。

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

相反,这样做是一个呼叫:

新日期(TD [0],TD [1] -1,TD [2],0,0,0,0,0(

您已经很好地弄清了问题 - 今天是本月的第31个。

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

现在,我们可以将其视为拥有这样的伪结构,记住那个月是基于0的:

{
  year: 2017
  month: 4
  date: 31
}

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

{
  year: 2017
  month: 5
  date: 31
}

但它知道6月没有31天。六月的第31天是7月1日。因此,它可以帮助您出去并将其调整为

{
  year: 2017
  month: 6
  date: 1
}

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

{
  year: 2017
  month: 6
  date: 2
}

在有效的功能中,您正在设置一个月之前的日期,因此您没有重新计算您的一天,以防您指定的日期大于该月的天数。

最新更新