由于 UTC,JSON Stringify 更改日期时间

IT技术 javascript json datetime utc
2021-01-15 13:35:36

由于我所在的位置,我在 JavaScript 中的日期对象总是用 UTC +2 表示。因此像这样

Mon Sep 28 10:00:00 UTC+0200 2009

问题是JSON.stringify将上述日期转换为

2009-09-28T08:00:00Z  (notice 2 hours missing i.e. 8 instead of 10)

我需要的是尊重日期和时间,但事实并非如此,因此应该是

2009-09-28T10:00:00Z  (this is how it should be)

基本上我用这个:

var jsonData = JSON.stringify(jsonObject);

我尝试传递一个替换参数(stringify 上的第二个参数),但问题是该值已被处理。

我也尝试在日期对象上使用toString()toUTCString(),但这些也没有给我我想要的东西..

谁能帮我?

6个回答

最近我遇到了同样的问题。它是使用以下代码解决的:

x = new Date();
let hoursDiff = x.getHours() - x.getTimezoneOffset() / 60;
let minutesDiff = (x.getHours() - x.getTimezoneOffset()) % 60;
x.setHours(hoursDiff);
x.setMinutes(minutesDiff);
这个答案是错误的。OP 没有意识到“2009-09-28T08:00:00Z”和“Mon Sep 28 10:00:00 UTC+0200 2009”在时间完全相同,并且调整时区偏移实际上是在创建错误的时间。
2021-03-22 13:35:36
谢谢...我实际上在这里找到了一个很棒的库,blog.stevenlevithan.com/archives/date-time-format 所有你需要做的(也许它会帮助你),你传递 false 并且它不会转换。var something = dateFormat(myStartDate, "isoDateTime", false);
2021-03-24 13:35:36
显然,应该计算这个值。
2021-03-26 13:35:36
这是不正确的,因为它使您的代码非时区安全 - 当您重新读取日期时,您应该更正时区。
2021-03-26 13:35:36
是的,但这是如果该网站在我的国家/地区使用,如果它在美国等其他国家/地区使用 - 它不会是 2 ...
2021-04-12 13:35:36

JSON 使用Date.prototype.toISOString不代表本地时间函数——它代表未修改的 UTC 时间——如果您查看日期输出,您可以看到您处于 UTC+2 小时,这就是 JSON 字符串更改两个小时的原因,但如果这允许跨多个时区正确表示相同的时间。

从来没有想过这个,但你是对的。这就是解决方案:我可以使用原型设计指定我喜欢的任何格式。
2021-03-31 13:35:36

只是为了记录,请记住“2009-09-28T08:00:00Z”中的最后一个“Z”表示时间确实是UTC。

有关详细信息,请参阅http://en.wikipedia.org/wiki/ISO_8601

date.toJSON() 将 UTC-Date 打印为格式化的字符串(因此在将其转换为 JSON 格式时添加偏移量)。

date = new Date();
new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toJSON();
这也适用于我,但是您能解释一下您是如何做到的吗?
2021-03-21 13:35:36
通常最好对代码的作用添加解释。这允许新的开发人员了解代码的工作原理。
2021-03-22 13:35:36
你能解释为什么答案中的代码应该有效吗?
2021-03-31 13:35:36
对我来说这是最好的答案
2021-04-01 13:35:36
我将尝试解释这段代码的第二行…… date.getTime()以毫秒为单位返回时间,因此我们也应该将第二个操作数转换为毫秒。由于date.getTimezoneOffset()以分钟为单位返回偏移量,我们将其乘以 60000,因为 1 分钟 = 60000 毫秒。因此,通过从当前时间中减去偏移量,我们得到了 UTC 时间。
2021-04-06 13:35:36

这是另一个答案(我个人认为它更合适)

var currentDate = new Date(); 
currentDate = JSON.stringify(currentDate);

// Now currentDate is in a different format... oh gosh what do we do...

currentDate = new Date(JSON.parse(currentDate));

// Now currentDate is back to its original form :)
@Rohaan 感谢您指出这一点,但问题上的标签提到了 JavaScript。
2021-03-17 13:35:36