【问题标题】:JavaScript date returns wrong month if day is 01如果日期是 01,JavaScript 日期返回错误的月份
【发布时间】:2014-08-13 14:24:52
【问题描述】:

我正在尝试从日期字符串中获取正确的月份,只要日期不是本月的第一天 (01),它就可以正常工作。如果是第一天,则返回上个月:

<!DOCTYPE html>
<html>
<body>
<p>Click the button to display the month.</p>
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>

<script>
function myFunction() {
    var str="2014-12-01"
    var d = new Date(str); 
    var m = d.getMonth()+1;
    document.getElementById("demo").innerHTML = m;
}
</script>

</body>
</html>

返回:11 应该返回:12

如果日期字符串是2013-8-01,那么将返回7,而它应该是8。如果在getMonth() 之后没有+1,则将返回6,而不是7

【问题讨论】:

  • 日期字符串被解析为 UTC,所以如果您在格林威治以西的时区,日期将是前一天。对于那些有正偏移的人来说,它工作得很好。 :-)

标签: javascript date


【解决方案1】:

实际问题出在您计算机的时区范围内。

假设您的计算机位于Eastern Time (GMT-5):

var foo = new Date('2014-12-01');

foo.toUTCString(); // "Mon, 01 Dec 2014 00:00:00 GMT"
foo.toISOString(); // "2014-12-01T00:00:00.000Z"
foo.toString(); // "Sun Nov 30 2014 19:00:00 GMT-0500 (Eastern Standard Time)"

请注意,日期实际上是在 11 月,因为它晚了几个小时,因此零索引月份将是 10。如果您不提供时间字符串,JavaScript 会自动假定 UTC。

getMonth() 方法根据本地时间返回指定日期中的月份,作为从零开始的值(其中零表示一年中的第一个月。

在当地时间,此 Date 对象表示 11 月 30 日 19:00(晚上 7 点),因此 getMonth() 返回 10:

foo.getMonth(); // 10
foo.getUTCMonth(); // 11

如果您不关心时区而只是处理日期,不妨考虑使用getUTC* 方法。

You can read more about the Date object here.希望这会有所帮助。

【讨论】:

  • getMonth() 方法根据本地时间返回指定日期的月份,作为从零开始的值(其中零表示一年中的第一个月)。 getUTCMonth 返回的值是一个 0 到 11 之间的整数,对应月份。 0 代表 1 月,1 代表 2 月,2 代表 3 月,依此类推。
  • 这正是正在发生的事情。在当地时间,月份仍然是 11 月,因此返回 10。
  • 我遇到了这个确切的问题。但是,我已经在使用 getUTCMonth() ,它在每个月的第一天返回上个月。将此切换为 getMonth() 解决了问题并返回了正确的月份。我的问题以相反方式得到解决的一个可能原因是我使用了预先存在的纪元时间戳,这些时间戳可能是在比我的当地时间晚 4/5 小时的当地时间生成的。
【解决方案2】:

JavaScript 正在做它应该做的事情。在日值中,它将01 解释为0,而日的零值被解释为上个月的最后一天。这就像用 31 天要求一个月的第 32 天。这将返回下个月第一天的日期。

【讨论】:

  • 你错了!!! var str="2014-12-18"; var d = new Date(str); var m = d.getMonth(); // &lt;- 11
  • 想一想,OP的日期格式一开始就不正确。应该是var str="2014,12,1"
  • var str="2014-12-18"; var d = new Date(str); alert(d); // &lt;- Thu Dec 18 2014 04:00:00 GMT+0400 他的代码一切正常
  • var str="2014-12-1"; var d = new Date(str); alert(d) // Invalid date`
  • 这个答案不正确。请参阅 rink.attendant.6 的回答。
【解决方案3】:

getMonth() 返回一个从 0 到 11 的值:http://www.w3schools.com/jsref/jsref_getmonth.asp 一月是 0,二月是 1,依此类推。

因此,要获得“正确”月份,您应该 +1。

【讨论】:

  • 这不是问题。请参阅 rink.attendant.6 的回答。
猜你喜欢
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多