JSON由于UTC,Stringify会更改date时间

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

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

问题是做一个JSON.stringify转换上述date

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

我需要的是date和时间,但不是,所以应该是

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

基本上我使用这个:

 var jsonData = JSON.stringify(jsonObject); 

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

我也尝试过在date对象上使用toString()toUTCString() ,但是这些都不给我我想要的东西。

任何人都可以帮我吗?

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

 x = new Date(); x.setHours(x.getHours() - x.getTimezoneOffset() / 60); 

JSON使用Date.prototype.toISOString函数,它不代表本地时间 – 它代表时间在未修改的UTC – 如果你看看你的date输出,你可以看到你在UTC + 2小时,这就是为什么JSONstring更改两个小时,但如果这允许同一时间跨多个时区正确表示。

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

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

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

 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 :) 

通常你想要在每个用户的本地时间内显示date,

这就是为什么我们使用GMT(UTC)。

使用Date.parse(jsondatestring)来获取本地时间string,

除非你想让你的当地时间显示给每个访问者。

在这种情况下,使用阿纳托利的方法。

我有点迟了,但是你可以总是用Date Prototype覆盖toJson函数,如下所示:

 Date.prototype.toJSON = function(){ return Util.getDateTimeString(this); }; 

在我的情况下,Util.getDateTimeString(this)返回一个像这样的string:“2017-01-19T00:00:00Z”

如果你的服务器后端是时区不可知的, 如果不是,则需要假定服务器的时区与客户端相同,或者传输客户端时区的信息,并将其包含在计算中。

一个基于PostgreSQL后端的例子:

 select '2009-09-28T08:00:00Z'::timestamp -> '2009-09-28 08:00:00' (wrong for 10am) select '2009-09-28T08:00:00Z'::timestamptz -> '2009-09-28 10:00:00+02' select '2009-09-28T08:00:00Z'::timestamptz::timestamp -> '2009-09-28 10:00:00' 

最后一个可能是你想在数据库中使用,如果你不愿意正确地实现时区逻辑。

而不是toJSON ,你可以使用format函数总是给出正确的date和时间+ GMT

这是最健壮的显示选项。 它需要一串令牌,并用相应的值replace它们。

通过使用moment.js库(非时区版本)来解决这个问题。

 var newMinDate = moment(datePicker.selectedDates[0]); var newMaxDate = moment(datePicker.selectedDates[1]); // Define the data to ask the server for var dataToGet = {"ArduinoDeviceIdentifier":"Temperatures", "StartDate":newMinDate.format('YYYY-MM-DD HH:mm'), "EndDate":newMaxDate.format('YYYY-MM-DD HH:mm') }; alert(JSON.stringify(dataToGet)); 

我正在使用flatpickr.min.js库。 创build的JSON对象的时间与提供的本地时间匹配,但是dateselect器。

date.toJSON()将UTCdate打印为格式化为String的string(所以在将其转换为JSON格式时,将其与偏移量相加)。

 date = new Date(); new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toJSON();