在我的 Java Script 应用程序中,我以如下格式存储日期:
2011-09-24
现在,当我尝试使用上述值创建一个新的 Date 对象(以便我可以以不同的格式检索日期)时,该日期总是在休息一天后返回。见下文:
var doo = new Date("2011-09-24");
console.log(doo);
日志:
Fri Sep 23 2011 20:00:00 GMT-0400 (Eastern Daylight Time)
在我的 Java Script 应用程序中,我以如下格式存储日期:
2011-09-24
现在,当我尝试使用上述值创建一个新的 Date 对象(以便我可以以不同的格式检索日期)时,该日期总是在休息一天后返回。见下文:
var doo = new Date("2011-09-24");
console.log(doo);
日志:
Fri Sep 23 2011 20:00:00 GMT-0400 (Eastern Daylight Time)
有一些疯狂的事情,与JS发生日期对象,将字符串,例如考虑您提供以下日期
注意:以下示例可能会或可能不会休息一天,具体取决于您的时区和当前时间。
new Date("2011-09-24"); // Year-Month-Day
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF.
但是,如果我们将字符串格式重新排列为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.
我们可以在创建新日期时轻松更改日期“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.
如果我们有一个像“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.
我通常必须管理日期格式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.
更新
如果您为 Date 构造函数提供单独的参数,您可以获得其他有用的输出,如下所述
注意:参数可以是数字或字符串类型。我将展示具有混合值的示例。
获取给定年份的第一个月和第一天
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)
数字、字符串参数的示例。请注意,月份是三月,因为再次以零为基础的月份。
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)
向任何年份和月份参数添加零日将获得上个月的最后一天。如果您继续使用负数,您可以继续回滚另一天
new Date(2011, "02", -1);
// => Sun Feb 27 2011 00:00:00 GMT-0700 (MST)
请注意,东部夏令时间是-4 hours
,您返回日期的小时数是20
。
20h + 4h = 24h
这是 2011-09-24 的午夜。日期以 UTC (GMT)解析,因为您提供了一个没有任何时区指示符的仅日期字符串。如果您提供了一个没有指示符的日期/时间字符串 ( new Date("2011-09-24T00:00:00")
),它将在您的本地时区中进行解析。(历史上一直存在不一致,尤其是因为规范更改了不止一次,但现代浏览器应该没问题;或者您始终可以包含时区指示器。)
您得到了正确的日期,只是您从未指定正确的时区。
如果您需要访问日期值,您可以使用getUTCDate()
或任何其他getUTC*()
功能:
var d,
days;
d = new Date('2011-09-24');
days = ['Sun', 'Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat'];
console.log(days[d.getUTCDay()]);
将日期标准化并消除不需要的偏移(此处测试: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(此处测试:https : //jsfiddle.net/7xp1xL5m/1/ ):
var doo = new Date("2011-09-24");
console.log( new Date( doo.getTime() - doo.getTimezoneOffset() * -60000 ) );
我认为这与时区调整有关。您创建的日期是 GMT,默认时间是午夜,但您的时区是 EDT,因此减去 4 小时。试试这个来验证:
var doo = new Date("2011-09-25 EDT");
如果要获取本地时区中某个日期的 0 小时,请将各个日期部分传递给Date
构造函数。
new Date(2011,08,24); // month value is 0 based, others are 1 based.