将 JavaScript Date 对象转换为 JSON 字符串时日期更改为前一天

Posted

技术标签:

【中文标题】将 JavaScript Date 对象转换为 JSON 字符串时日期更改为前一天【英文标题】:The date changing to one day before while converting JavaScript Date object to a JSON string 【发布时间】:2020-06-20 10:07:33 【问题描述】:

我想将一个日期对象(日期为 MM/DD/YYYY 格式的“12/01/2019”)作为 JSON 字符串传递给 API。但是在将此日期(不考虑时区)转换为 JSON 字符串时,日期会更改为前一天。请看下面给出的代码:

var newDate = new Date("12/01/19");
console.log(newDate)        // Showing Sun Dec 01 2019 00:00:00 GMT+0530 (India Standard Time)
var jsonDate = JSON.stringify(newDate);
console.log(jsonDate)       // Showing "2019-11-30T18:30:00.000Z"

日期 2019 年 12 月 1 日更改为 2019 年 11 月 30 日。就我而言,我无法考虑时间或时区。我也不能使用“Moment JS”。

为什么会这样?谁能说明这个奇怪问题背后的原因?

【问题讨论】:

【参考方案1】:

由于您的日期字符串是非标准格式,Date 构造函数将其视为本地时间(请参阅“假定时区差异”部分中的Date.parse() 手册)。但是,JSON.stringify() 调用 Date.toJSON(),后者调用 Date.toISOString(),它始终输出具有零 UTC 偏移量的时间。因此,您需要通过减去时区偏移量将您的日期转换为 UTC,这可以通过Date.getTimezoneOffset() 获得。

或者,提供 ISO 格式 (YYYY-MM-DD) 日期字符串并且不需要调整,因为 Date 构造函数会将其视为 UTC 时间。

// non-standard date format
var newDate = new Date('12/01/19');
console.log(newDate.toJSON());

var os = newDate.getTimezoneOffset();
newDate = new Date(newDate.getTime() - os * 60 * 1000);
console.log(newDate.toJSON());

// ISO format date
var newDate2 = new Date('2019-12-01');
console.log(newDate2.toJSON());

【讨论】:

@VigneshVS 不用担心 - 我很高兴能帮上忙。

以上是关于将 JavaScript Date 对象转换为 JSON 字符串时日期更改为前一天的主要内容,如果未能解决你的问题,请参考以下文章

将unix时间戳转换为javascript日期对象[重复]

将 Json 日期字符串转换为 JavaScript 日期对象

JavaScript Date 对象的月份索引从 0 开始

如何将日期字符串转换为日期或日历对象?

将 mySQL 日期转换为 Javascript 日期

如何将 javascript Date() 转换为 COleDateTime