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();