在我的Java脚本应用程序中,我以这样的格式存储日期:
2011-09-24
现在,当我尝试使用上面的值创建一个新的Date对象(这样我就可以以不同的格式检索日期)时,日期总是返回一天。见下文:
var date = new Date("2011-09-24");
console.log(date);
日志:
Fri Sep 23 2011 20:00:00 GMT-0400 (Eastern Daylight Time)
在我的Java脚本应用程序中,我以这样的格式存储日期:
2011-09-24
现在,当我尝试使用上面的值创建一个新的Date对象(这样我就可以以不同的格式检索日期)时,日期总是返回一天。见下文:
var date = new Date("2011-09-24");
console.log(date);
日志:
Fri Sep 23 2011 20:00:00 GMT-0400 (Eastern Daylight Time)
当前回答
当我的客户使用大西洋标准时间时,我遇到了这个问题。客户端检索到的日期值是“2018-11-23”,当代码将其传递到new date(“2018-11-23”)时,客户端的输出是前一天的日期。我创建了一个实用函数,如代码片段所示,它规范化了日期,向客户端提供了预期的日期。
日期。
var normalizeDate = function(date) { date.setMinutes(date.getMinutes() + date.getTimezoneOffset()); return date; }; var date = new Date("2018-11-23"); document.getElementById("default").textContent = date; document.getElementById("normalized").textContent = normalizeDate(date); <h2>Calling new Date("2018-11-23")</h2> <div> <label><b>Default</b> : </label> <span id="default"></span> </div> <hr> <div> <label><b>Normalized</b> : </label> <span id="normalized"></span> </div>
其他回答
您正在使用ISO日期字符串格式,根据此页,将导致使用UTC时区构造日期:
注意:使用date构造函数(和 日期。解析,它们是等效的)是强烈不鼓励的,因为 浏览器差异和不一致。支持RFC 2822格式 字符串只是按照惯例。对ISO 8601格式的支持有所不同 只有日期的字符串(例如:"1970-01-01")被视为UTC,而不是 当地。
如果文本格式不同,例如“Jan 01 1970”,那么(至少在我的机器上)它使用您的本地时区。
JS DATE对象转换字符串时会发生一些疯狂的事情,例如考虑您提供的以下日期
注意:根据您所在的时区和当前时间,以下示例可能是一天假,也可能不是一天假。
new Date("2011-09-24"); // Year-Month-Day
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF.
但是,如果我们将字符串格式重新排列为月-日-年…
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)
数字,字符串参数的例子。注意,这个月是3月,因为又是以零为基础的月份。
new Date(2011, "02");
// => Tue Mar 01 2011 00:00:00 GMT-0700 (MST)
如果我们做同样的事情,但是一天是0,我们得到的结果是不同的。
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)
在任何年和月参数中添加0的一天将得到前一个月的最后一天。如果你继续用负数,你可以在另一天继续回滚
new Date(2011, "02", -1);
// => Sun Feb 27 2011 00:00:00 GMT-0700 (MST)
这可能不是一个好的答案,但我只是想分享我在这个问题上的经验。
我的应用程序是全球使用utc日期的格式'YYYY-MM-DD',而datepicker插件我只接受js日期,这对我来说很难同时考虑utc和js。所以当我想传递一个'YYYY-MM-DD'格式的日期到我的datepicker,我首先转换为'MM/DD/YYYY'格式使用moment.js或任何你喜欢的,日期显示在datepicker现在是正确的。举个例子
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是我想要的。希望这对一些人有所帮助。
你的问题是时区。注意GMT-0400部分,也就是你比GMT晚4个小时。如果在显示的日期/时间上加上4个小时,就会得到2011/09/24的零点。使用toUTCString()方法来获取GMT字符串:
var doo = new Date("2011-09-24");
console.log(doo.toUTCString());
如果你需要一个简单的解决方案,请参阅:
new Date('1993-01-20'.split('-'));