我有一个由用户创建的日期对象,时区由浏览器填充,如下所示:
var date = new Date(2011, 05, 07, 04, 0, 0); > Tue Jun 07 2011 04:00:00 GMT+1000 (E. Australia Standard Time)
不过,当我将其字符串化时,时区会再见
JSON.stringify(date); > "2011-06-06T18:00:00.000Z"
在保留浏览器时区的同时获取ISO8601字符串的最佳方法是使用moment.js并使用moment.format(),但是如果我通过JSON.stringify内部使用的东西序列化整个命令(在这种情况下,是AngularJS)当然是行不通的)
moment.format()
JSON.stringify
var command = { time: date, contents: 'foo' }; $http.post('/Notes/Add', command);
为了完整起见,我的域 确实 需要本地时间和偏移量。
假设您有某种包含的对象Date:
Date
var o = { d : new Date() };
您可以覆盖原型的toJSON功能Date。在这里,我使用moment.js moment从日期创建一个对象,然后使用format不带参数的moment的函数,该函数发出包含偏移量的ISO8601扩展格式。
toJSON
moment
format
Date.prototype.toJSON = function(){ return moment(this).format(); }
现在,当您序列化对象时,它将使用您要求的日期格式:
var json = JSON.stringify(o); // '{"d":"2015-06-28T13:51:13-07:00"}'
当然,这将影响 所有 Date对象。如果只想更改特定日期对象的行为,则可以覆盖该特定对象的toJSON功能,如下所示:
o.d.toJSON = function(){ return moment(this).format(); }