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

当前回答

// 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"

其他回答

// 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"

您可以通过将此日期转换为UTC日期

new Date(Date.UTC(Year, Month, Day, Hour, Minute, Second))

并且总是建议使用UTC(通用时区)日期,而不是使用本地时间的日期,因为默认情况下,日期以UTC存储在数据库中。因此,在整个项目中使用和解释UTC格式的日期是一个很好的实践。 例如,

Date.getUTCYear(), getUTCMonth(), getUTCDay(), getUTCHours()

因此,使用UTC日期解决了所有与时区相关的问题。

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)

这个通过我循环,zzzBov的答案是+1。这是一个完整的转换日期,为我工作使用UTC方法:

//myMeeting.MeetingDate = '2015-01-30T00:00:00'

var myDate = new Date(myMeeting.MeetingDate);
//convert to JavaScript date format
//returns date of 'Thu Jan 29 2015 19:00:00 GMT-0500 (Eastern Standard Time)' <-- One Day Off!

myDate = new Date(myDate.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate());
//returns date of 'Fri Jan 30 2015 00:00:00 GMT-0500 (Eastern Standard Time)' <-- Correct Date!

我遇到过这样的问题。但我的问题是off set,而从数据库获取日期。

这是在数据库中,它是UTC格式。

2019-03-29 19:00:00.0000000 +00:00

所以当我从数据库和检查日期,它是添加偏移量与它,并发送回javascript。

它正在添加+05:00,因为这是我的服务器时区。我的客户在不同的时区+07:00。

2019-03-28T19:00:00+05:00 //这是我在javascript中得到的。

所以这是我的解决方案,我所做的这个问题。

var dates = price.deliveryDate.split(/-|T|:/);
var expDate = new Date(dates[0], dates[1] - 1, dates[2], dates[3], dates[4]);
var expirationDate = new Date(expDate);

因此,当日期来自服务器,有服务器偏移量,所以我分割日期和删除服务器偏移量,然后转换为日期。它解决了我的问题。