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

当前回答

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)

其他回答

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

您可以使用时刻库来格式化日期。 https://momentjs.com/

let format1 = "YYYY-MM-DD"
let date = new Date();

console.log(moment(date).format(format1))

EDIT

时刻现在已弃用,您可以使用date-fns format方法格式化日期。

import { format } from 'date-fns'
format(new Date(), "yyyy-MM-dd")

当我的客户使用大西洋标准时间时,我遇到了这个问题。客户端检索到的日期值是“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日期而不受时区困扰的解决方案是在解析它之前在结尾添加“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)

如果你只是想确保日期的各个部分保持不变,即使我改变了时区,这个方法似乎也能奏效:

var doo = new Date("2011-09-24 00:00:00")

只要把0加进去。

在我的代码中,我这样做:

let dateForDisplayToUser = 
  new Date( `${YYYYMMDDdateStringSeparatedByHyphensFromAPI} 00:00:00` )
  .toLocaleDateString( 
    'en-GB', 
    { day: 'numeric', month: 'short', year: 'numeric' }
  )

我在我的电脑上切换时区,日期保持不变,我从API得到的日期字符串yyyy-mm-dd。

但我是不是遗漏了什么/这是个坏主意?

*至少在chrome中。这在Safari中不起作用!撰写本文时