有人对为什么会发生这种情况有任何想法吗?今天,我发现我写的日期转换功能开始返回错误的月份。例如,尝试转换" 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
}
在有效的功能中,您正在设置一个月之前的日期,因此您没有重新计算您的一天,以防您指定的日期大于该月的天数。