2011-03-31 126 views
4

我从字符串中获取日期,解析它以获取日期,月份和年份constituant并将它们用于实例Date对象。JavaScript setDate返回错误的日期

我想要实现的是将日期递增一天。 这一切工作正常,但setDate方法坚持有时返回我无效的日期有时...

例如,如果我添加1天到2011年2月28日,它将返回我2011年2月29日...一个日期这实际上不存在。

这是JavaScript本地日期/时间API的错误/限制,还是我只是做错了什么?我发现很难相信它没有检查日期的有效性就表现出这种行为。

var myDate = new Date(2011, 2, 28); 
alert(myDate); 
myDate.setDate(myDate.getDate() + 1); 
alert(myDate); // 29 February 2011 ! 

谢谢。

回答

10

你是不是在二月 - 月#2是MARCH

基于

JS月份是0

var myDate = new Date(2011, 1, 28); // 28th of Feb 
alert(myDate); 
myDate.setDate(myDate.getDate() + 1); 
alert(myDate); // 1st of March 2011 ! 

PS:你在哪里可能有一些问题是在整个夏令时间,如果你正在创建日期使用var d = new Date()并且不要在几小时后做标准化d.setHours(0,0,0,0)之后

+0

我现在看到的,非常感谢。我来自.Net背景,并且DateTime对象在那里没有这样的行为......我怀疑我做错了什么......不能说我发现这种行为非常直观,尽管大多数事情在编程中是基于0的。 – 2011-03-31 09:34:11

+0

它更加不直观,年份和日期部分似乎不是基于0的... – 2011-03-31 09:51:39

+0

@Kharlos - 日数也是以0为基础的 - 0 =星期日 - 其中之一 - 更多信息在这里:[为什么是1月在Java日历0?](http://stackoverflow.com/questions/344380/why-is-january-month-0-in-java-calendar) – mplungjan 2011-03-31 09:55:56

1

不,你正在使用March,不是吗? 3月29日存在。

var myDate = new Date(2011, 1, 28); // 28th of february 
1

你忘了,这几个月计数从0 VAR指明MyDate =新的日期(2011年,2,28); 实际上是 周一2011-3-28 00:00:00 GMT + 0300(FLE夏令时间){}

尝试

var myDate = new Date(2011, 1, 28); 
alert(myDate); 
myDate.setDate(myDate.getDate() + 1); 
alert(myDate); // 1 Mar 2011 !