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

当前回答

注意,东部夏令时是-4小时,而你返回的日期是20小时。

20h + 4h = 24h

2011年9月24日午夜。日期是用UTC (GMT)解析的,因为您提供了一个只有日期的字符串,没有任何时区指示器。如果您给出的日期/时间字符串不带指示器(new date ("2011-09-24T00:00:00")),那么它将在您的本地时区进行解析。(历史上有不一致的地方,不仅仅是因为规范改变了不止一次,但现代浏览器应该是可以的;或者你总是可以包含一个时区指示器。)

你得到了正确的日期,只是没有指定正确的时区。

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

var d, 天; d = new日期('2011-09-24'); 天=[‘太阳’,‘我’,“面前”,“结婚”,“碰头”,“星期五”,“坐”); console.log(天[d.getUTCDay ()));

其他回答

使用moment可以在转换为isostring时保持偏移量

let date = moment("2022-03-15").toISOString();
// WRONG OUTPUT 2022-03-14T18:30:00.000Z

let date = moment("2022-03-15").toISOString(true);
// CORRECT OUTPUT 2022-03-15T00:00:00.000+05:30

要规范化日期并消除不需要的偏移量(在这里测试: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 )  );

// When the time zone offset is absent, date-only formats such as '2011-09-24' // are interpreted as UTC time, however the date object will display the date // relative to your machine's local time zone, thus producing a one-day-off output. const date = new Date('2011-09-24'); console.log(date); // Fri Sep 23 2011 17:00:00 GMT-0700 (PDT) console.log(date.toLocaleDateString('en-US')); // "9/23/2011" // To ensure the date object displays consistently with your input, simply set // the timeZone parameter to 'UTC' in your options argument. console.log(date.toLocaleDateString('en-US', { timeZone: 'UTC' })); // "9/24/2011"

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

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

注意,东部夏令时是-4小时,而你返回的日期是20小时。

20h + 4h = 24h

2011年9月24日午夜。日期是用UTC (GMT)解析的,因为您提供了一个只有日期的字符串,没有任何时区指示器。如果您给出的日期/时间字符串不带指示器(new date ("2011-09-24T00:00:00")),那么它将在您的本地时区进行解析。(历史上有不一致的地方,不仅仅是因为规范改变了不止一次,但现代浏览器应该是可以的;或者你总是可以包含一个时区指示器。)

你得到了正确的日期,只是没有指定正确的时区。

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

var d, 天; d = new日期('2011-09-24'); 天=[‘太阳’,‘我’,“面前”,“结婚”,“碰头”,“星期五”,“坐”); console.log(天[d.getUTCDay ()));