在我的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)

当前回答

我只是想就这个问题发表我的意见,因为这篇文章对解决这个问题非常有帮助。我想我没见过这个解决方案,如果我说错了请指正。

正如这里已经提到过无数次的那样,问题主要来自夏季/冬季时间。我注意到1月份的GMT是+1。如果没有设置时间,它将始终是00.00.00(午夜),这将导致前一天的第23小时。

如果您有一个动态日期并且不关心小时,您可以在使用toISOString()之前使用setHours()方法设置小时。

语法: setHours(hoursValue, minutesValue, secondsValue, msValue)

这意味着:

dynamicDate.setHours(12, 0, 0, 0)
dynamicDate.toISOString()

应该希望为您工作,即使日期提前/后一个小时,它仍然是同一天,现在我们将时间设置为中午。

更多关于MDN上的setHours()。

其他回答

下面的方法对我很有效

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

您正在使用ISO日期字符串格式,根据此页,将导致使用UTC时区构造日期:

注意:使用date构造函数(和 日期。解析,它们是等效的)是强烈不鼓励的,因为 浏览器差异和不一致。支持RFC 2822格式 字符串只是按照惯例。对ISO 8601格式的支持有所不同 只有日期的字符串(例如:"1970-01-01")被视为UTC,而不是 当地。

如果文本格式不同,例如“Jan 01 1970”,那么(至少在我的机器上)它使用您的本地时区。

如果希望获得本地时区某个日期的0小时,请将各个日期部分传递给date构造函数。

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

虽然在OP的情况下,时区是EDT,但不能保证执行脚本的用户将是EDT时区,因此硬编码偏移量不一定有效。我找到的解决方案是分割日期字符串,并使用date构造函数中的单独值。

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

注意,您必须考虑JS的另一个奇怪之处:月份是从零开始的。

意思是格林尼治时间2011-09-24 00:00:00,因为你现在在格林尼治时间-4,所以是前一天的20:00。

就我个人而言,我得到的是2011-09-24 02:00:00,因为我生活在GMT +2。