JavaScriptdate对象总是有一天rest?

在我的java脚本的应用程序中,我有这样的格式存储date:

2011-09-24 

现在当我尝试使用上面的值来创build一个新的Date对象(所以我可以检索不同的格式的date),date总是回来rest一天。 见下文:

 var doo = new Date("2011-09-24"); console.log(doo); Fri Sep 23 2011 20:00:00 GMT-0400 (Eastern Daylight Time) 

任何帮助,这是表示赞赏。

谢谢

请注意,东部夏令时是-4 hours ,您回来的date是20小时。

 20h + 4h = 24h 

这是2011-09-24的午夜。

你得到正确的date,你从来没有指定正确的时区。

如果您需要访问date值,可以使用getUTCDate()或其他任何getUTC*()函数 :

 var d, days; d = new Date('2011-09-24'); days = ['Sun', 'Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat']; console.log(days[d.getUTCDay()]); 

JS转换string的JS DATE对象有几个疯狂的事情,例如考虑你提供的date

注意:根据您的时区和当前时间,以下示例可能会或可能不会一天closures

 new Date("2011-09-24"); // Year-Month-Day // => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF. 

但是,如果我们将string格式重新排列为Month-Day-Year

 new Date("09-24-2011"); => // Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE. 

另外一个奇怪的

 new Date("2011-09-24"); // => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF AS BEFORE. new Date("2011/09/24"); // change from "-" to "/". => // Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE. 

在创build新date时,我们可以在date“2011-09-24”中轻松更改连字符

 new Date("2011-09-24".replace(/-/g, '\/')); // => "2011/09/24". => // Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE. 

如果我们有datestring,如“2011-09-24T00:00:00”

 new Date("2011-09-24T00:00:00"); // => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF. 

现在把连字符改成斜线 ; 怎么了?

 new Date("2011/09/24T00:00:00"); // => Invalid Date 

我通常必须pipe理date格式2011-09-24T00:00:00所以这就是我所做的。

 new Date("2011-09-24T00:00:00".replace(/-/g, '\/').replace(/T.+/, '')); // => Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE. 

UPDATE

如果您向Date构造函数提供单独的参数,则可以获得其他有用的输出,如下所述

注意:参数可以是Number或Stringtypes。 我将展示具有混合值的示例。

获取特定年份的第一个月和第一天

 new Date(2011, 0); // Normal behavior as months in this case are zero based. => // Sat Jan 01 2011 00:00:00 GMT-0700 (MST) 

获取一年的最后一个月和一天

 new Date((2011 + 1), 0, 0); // The second zero roles back one day into the previous month's last day. => // Sat Dec 31 2011 00:00:00 GMT-0700 (MST) 

数字,string参数的示例。 请注意,月份是3月份,因为月份为零。

 new Date(2011, "02"); => // Tue Mar 01 2011 00:00:00 GMT-0700 (MST) 

如果我们做同样的事情,但一天零,我们得到不同的东西。

 new Date(2011, "02", 0); // again the zero roles back from March to the last day of February. => // Mon Feb 28 2011 00:00:00 GMT-0700 (MST) 

在任何年份和月份参数中添加一个零的date将获得上个月的最后一天。 如果您继续使用负数,则可以继续向前滚动一天

 new Date(2011, "02", -1); => // Sun Feb 27 2011 00:00:00 GMT-0700 (MST) 

要规范date和消除不必要的偏移量(在这里testing: https : //jsfiddle.net/7xp1xL5m/ ):

 var doo = new Date("2011-09-24"); console.log( new Date( doo.getTime() + Math.abs(doo.getTimezoneOffset()*60000) ) ); // Output: Sat Sep 24 2011 00:00:00 GMT-0400 (Eastern Daylight Time) 

这也完成了相同的功劳@tpartee(在这里testing: https ://jsfiddle.net/7xp1xL5m/1/):

 var doo = new Date("2011-09-24"); console.log( new Date( doo.getTime() - doo.getTimezoneOffset() * -60000 ) ); 

如果您想在本地时区中获取某个date的小时0,请将各个date部分传递给Date构造函数。

 new Date(2011,08,24); // month value is 0 based, others are 1 based. 

我相信这与时区调整有关。 您创build的date是格林尼治标准时间,默认时间是午夜,但您的时区是EDT,所以它减去4小时。 试试这个来validation:

 var doo = new Date("2011-09-25 EDT"); 

你的问题是专门与时区。 注意部分GMT-0400 – 这是你在格林威治时间后面4个小时。 如果您在显示的date/时间添加4个小时,则您将在2011/09/24正午十二点。 使用toUTCString()方法来获取GMTstring:

 var doo = new Date("2011-09-24"); console.log(doo.toUTCString()); 

只是想添加,显然在string的末尾添加空格将使用UTC进行创build。

 new Date("2016-07-06") > Tue Jul 05 2016 17:00:00 GMT-0700 (Pacific Daylight Time) new Date("2016-07-06 ") > Wed Jul 06 2016 00:00:00 GMT-0700 (Pacific Daylight Time) 

这通过我一个循环,zzzBov的答案+1。 以下是使用UTC方法为我工作的date的完整转换:

 //myMeeting.MeetingDate = '2015-01-30T00:00:00' var myDate = new Date(myMeeting.MeetingDate); //convert to JavaScript date format //returns date of 'Thu Jan 29 2015 19:00:00 GMT-0500 (Eastern Standard Time)' <-- One Day Off! myDate = new Date(myDate.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate()); //returns date of 'Fri Jan 30 2015 00:00:00 GMT-0500 (Eastern Standard Time)' <-- Correct Date! 

这意味着2011-09-24 00:00:00 GMT ,因为你在GMT -4 ,这将是前一天的20:00

我个人得到2011-09-24 02:00:00 ,因为我住的是GMT +2

虽然在OP的情况下,时区是EDT,但不能保证执行脚本的用户将在EDT时区,因此对偏移进行硬编码并不一定有效。 我find的解决scheme拆分datestring,并在Date构造函数中使用单独的值。

 var dateString = "2011-09-24"; var dateParts = dateString.split("-"); var date = new Date(dateParts[0], dateParts[1] - 1, dateParts[2]); 

请注意,你必须考虑另一个JS怪异:这个月是从零开始的。

这可能不是一个好的答案,但我只想分享我的经验与这个问题。

我的应用程序在全球范围内使用utc date格式为“YYYY-MM-DD”,而datepicker插件只使用接受jsdate,所以我很难同时考虑utc和js。 所以当我想通过一个'YYYY-MM-DD'格式的date到我的dateselect器时,我首先使用moment.js或任何你喜欢的方式将其转换为'MM / DD / YYYY'格式,并且datepicker上显示的date是现在正确。 对于你的例子

 var d = new Date('2011-09-24'); // d will be 'Fri Sep 23 2011 20:00:00 GMT-0400 (EDT)' for my lacale var d1 = new Date('09/24/2011'); // d1 will be 'Sat Sep 24 2011 00:00:00 GMT-0400 (EDT)' for my lacale 

显然d1是我想要的。 希望这对一些人会有所帮助。

不使用更多转换方法来处理这个问题的最好方法,

  var mydate='2016,3,3'; var utcDate = Date.parse(mydate); console.log(" You're getting back are 20. 20h + 4h = 24h :: "+utcDate); 

现在只需在您的date添加GMT或者您可以附加它。

  var mydateNew='2016,3,3'+ 'GMT'; var utcDateNew = Date.parse(mydateNew); console.log("the right time that you want:"+utcDateNew) 

直播: https : //jsfiddle.net/gajender/2kop9vrk/1/

以下为我工作 –

  var doo = new Date("2011-09-24").format("m/d/yyyy"); 

没关系,没注意到GMT -0400,这个date是昨天的

你可以尝试设置一个默认的“时间”为12:00:00