JavaScript的getDate返回错误的date

以下脚本返回20而不是21!

var d = new Date("2010/03/21"); document.write(d.getDate()); 

我究竟做错了什么? 这是一个JavaScript错误?

Date.parse方法依赖于实现( new Date(string)等同于Date.parse(string) )。

虽然这种格式将在现代浏览器上可用,但您不能100%确定浏览器会正确解释您所需的格式。

我build议你操纵你的string,并使用Date,month和day参数的Date构造函数:

 // parse a date in yyyy-mm-dd format function parseDate(input) { var parts = input.match(/(\d+)/g); // new Date(year, month [, date [, hours[, minutes[, seconds[, ms]]]]]) return new Date(parts[0], parts[1]-1, parts[2]); // months are 0-based } 

这是夏令时问题,因为Date()使用本地时间。

我住在巴西,2012年10月 – 21日是我国大部分地区的夏令时开始,因此0 – 0 – 1 – 0之间的0 – 0 – 1 – 0当地date在巴西不存在!

有些人在这里评论说,它的工作。 发生这种情况是因为正确或错误的小时回报取决于当地的用户国家。

请参阅: http : //www.timeanddate.com/news/time/brazil-dst-2012.html

在巴西,2012年,Java认为DST开始于10月14日(实际上是从1周后开始)

 var dt = new Date(2012,9,14); alert(dt.getHours()); 

产生1

请参阅: http : //www.timeanddate.com/time/dst/2013.html

解决scheme是使用UTC(协调世界时)的时间,因为没有夏令时的变化,你使用一种抽象的时间。 在大多数实际应用中没有问题。

 var dt = new Date( Date.UTC(2012, 9, 21, 8, 5, 12)); alert( (dt.getUTCMonth()+1) + '/' + dt.getUTCDate() + '/' + dt.getUTCFullYear() + " " + dt.getUTCHours()+ ':' + dt.getUTCMinutes() + ':' + dt.getUTCSeconds() ); 

如果有人不使用小时,分钟和秒钟,只要放置一个大于或等于1的虚拟小时值就更容易了,如上所示。

有没有机会将string参数视为UTC并将生成的Date对象视为本地时间,反之亦然? 这可能会把它扔掉。 将d.getDate()d.getUTCDate()进行比较。

我也通过getDate()得到1天的偏差,但是我注意到getUTCDate()返回期望的值。 问题出现在FF 3.6.12,但在Chrome上运行相同的代码是好的。

我的debugging代码:

 var date="2010-11-04"; alert(date); var d = new Date(date) alert(d.toDateString()+": "+ d.getDate()+" UTC "+d.getUTCDate()); 

这给了一个输出(FireFox):

Wed Nov 03 2010:3 UTC 4

Chrome很好。 所以有些地方可能会出现问题 – 可能是一个错误,但更可能是时区/ UTC参数问题。 提醒我PHP date()将在一天中返回23小时,如果时区改变那一天等等。

我在浏览器的地址栏中写了下面的代码,结果是21

 javascript:alert(new Date("2010/03/21").getDate()) 

有没有这样的事情作为一个Javascript的错误,因为有很多的Javascript实现,所以你要参考一个具体的实现。

我testing的实现是Chrome 4.1.249。 你的是啥呢?

我在Firefox 3.6和IE 8中testing了这个代码:

 <script type="text/javascript"> var d = new Date("2010/03/21"); document.write(d.getDate()); </script> 

这是显示正确的date:21

有关更多信息,请参阅: JavaScript Date对象

您也可以阅读维基百科的JavaScript兼容性考虑事项 。

http://jsbin.com/aqoki3/edit – 这里有你发布的代码,我得到21 。 所以它不是JS错误。 也许它在您的浏览器实现(JS)的错误。
所以要正确地初始化你的datevar使用new Date(year, month, date [, hour, minute, second, millisecond ])https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Date )。 这样你就可以肯定那一天是21,因为你隐含地把它设置为21。

我在firfox,safari,chrome,opera和IE中得到了相同的date(21),无论是使用string“2010/03/21”还是整数date参数(2010,2,21)。

我正在使用Windows机器和新版本的浏览器 –

你可以testing一下,看你的客户端是否parsing了string中的不同date,这是我看到的唯一一个问题。

 if(new Date("2010/03/21")- new Date(2010,2,21)){ alert(new Date("2010/03/21")); } 

确保您使用的月份数是-1,如果您正在查看六月份,则需要(6-1)

  var date_obj = new Date(y,(m-1),d); 

当给新的date一个stringdate时,string需要包括时区,否则将被解释为从不同的浏览器到其他(由于不同的JavaScript实现),从机器到其他(由于本地时区的差异)

 new Date('2017-07-31T10:00:00-0500'); 

你不能通过像date那样传递string参数来创buildDate对象。

像这样创build。

 var str_date = "2010/03/21"; var date = new Date(); var date_elements = str_date.split("/"); date.setYear(date_elements[0]); date.setMonth(date_elements[1]); date.setDay(date_elements[2]); alert(date.toString); 

注意date.toString方法。 它返回完整的datestring。 date.getDate只会给你那天的一天。

有关Date对象的更多信息,请参阅www.w3school.com