在我的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)
在我的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)
当前回答
由于大多数答案都很俗气,请允许我提出对我来说非常简单的方法:将脚本的时区设置为UTC
process.env.TZ = 'UTC' // this has to be run before any use of dates
有了这个更改,任何时区修改都是无效的,所以只要您不需要跑步者的实际时区,这可能是最简单的解决方法。
其他回答
我遇到过这样的问题。但我的问题是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);
因此,当日期来自服务器,有服务器偏移量,所以我分割日期和删除服务器偏移量,然后转换为日期。它解决了我的问题。
使用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
试着在这个帖子中添加我的2分(详细说明@paul-wintz的答案)。
在我看来,当日期构造函数接收到匹配ISO 8601格式(日期部分)的第一部分的字符串时,它会在UTC时区与0时间进行精确的日期转换。当该日期转换为当地时间时,可能会发生日期移位 如果午夜UTC是本地时区的较早日期。
new Date('2020-05-07')
Wed May 06 2020 20:00:00 GMT-0400 (Eastern Daylight Time)
如果日期字符串是任何其他“松散”格式(使用“/”或日期/月不填充为零),则在本地时区创建日期,因此没有日期转移问题。
new Date('2020/05/07')
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2020-5-07')
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2020-5-7')
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2020-05-7')
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)
因此,如上所述,一个快速修复方法是将ISO格式的Date字符串中的“-”替换为“/”。
new Date('2020-05-07'.replace('-','/'))
Thu May 07 2020 00: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)
你的问题是时区。注意GMT-0400部分,也就是你比GMT晚4个小时。如果在显示的日期/时间上加上4个小时,就会得到2011/09/24的零点。使用toUTCString()方法来获取GMT字符串:
var doo = new Date("2011-09-24");
console.log(doo.toUTCString());