在我的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)
当前回答
我只是想就这个问题发表我的意见,因为这篇文章对解决这个问题非常有帮助。我想我没见过这个解决方案,如果我说错了请指正。
正如这里已经提到过无数次的那样,问题主要来自夏季/冬季时间。我注意到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
有了这个更改,任何时区修改都是无效的,所以只要您不需要跑步者的实际时区,这可能是最简单的解决方法。