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

当前回答

我解析ISO日期而不受时区困扰的解决方案是在解析它之前在结尾添加“T12:00:00”,因为当格林威治的中午时,整个世界都在同一天:

function toDate(isoDateString) {
  // isoDateString is a string like "yyyy-MM-dd"
  return new Date(`${isoDateString}T12:00:00`);
}

之前:

> new Date("2020-10-06")
> Date Mon Oct 05 2020 14:00:00 GMT-1000 (heure normale d’Hawaii - Aléoutiennes)

后:

> toDate("2020-10-06")
> Date Tue Oct 06 2020 12:00:00 GMT-1000 (heure normale d’Hawaii - Aléoutiennes)

其他回答

你的问题是时区。注意GMT-0400部分,也就是你比GMT晚4个小时。如果在显示的日期/时间上加上4个小时,就会得到2011/09/24的零点。使用toUTCString()方法来获取GMT字符串:

var doo = new Date("2011-09-24");
console.log(doo.toUTCString());

这解决了我的问题(感谢@Sebastiao的回答)

var date = new Date();
//"Thu Jun 10 2021 18:46:00 GMT+0200 (Eastern European Standard Time)"

date.toString().split(/\+|-/)[0] ;  // .split(/\+|-/) is a regex for matching + or -
//"Thu Jun 10 2021 18:46:00 GMT"

var date_string_as_Y_M_D = (new Date(date)).toISOString().split('T')[0];
//2021-06-10

下面的方法对我很有效

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

虽然在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的另一个奇怪之处:月份是从零开始的。

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