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