有没有人想过为什么会发生这种情况?今天,我发现我写的日期转换函数开始返回错误的月份。例如,在尝试转换&#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>
答案 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
}
在有效的功能中,您将在月份之前设置日期,因此如果您指定的日期大于该月的天数,则不会重新计算当天的日期