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

当前回答

我只是想就这个问题发表我的意见,因为这篇文章对解决这个问题非常有帮助。我想我没见过这个解决方案,如果我说错了请指正。

正如这里已经提到过无数次的那样,问题主要来自夏季/冬季时间。我注意到1月份的GMT是+1。如果没有设置时间,它将始终是00.00.00(午夜),这将导致前一天的第23小时。

如果您有一个动态日期并且不关心小时,您可以在使用toISOString()之前使用setHours()方法设置小时。

语法: setHours(hoursValue, minutesValue, secondsValue, msValue)

这意味着:

dynamicDate.setHours(12, 0, 0, 0)
dynamicDate.toISOString()

应该希望为您工作,即使日期提前/后一个小时,它仍然是同一天,现在我们将时间设置为中午。

更多关于MDN上的setHours()。

其他回答

使用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://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")

我认为这与时区调整有关。您创建的日期是GMT,默认时间是午夜,但您的时区是EDT,因此减去4小时。试着验证一下:

var doo = new Date("2011-09-25 EDT");

这个通过我循环,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!

由于大多数答案都很俗气,请允许我提出对我来说非常简单的方法:将脚本的时区设置为UTC

process.env.TZ = 'UTC' // this has to be run before any use of dates

有了这个更改,任何时区修改都是无效的,所以只要您不需要跑步者的实际时区,这可能是最简单的解决方法。