如何对 javascript 日期进行 JSON 字符串化并保留时区

新手上路,请多包涵

我有一个由用户创建的日期对象,时区由浏览器填写,如下所示:

 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)

 var command = { time: date, contents: 'foo' };
$http.post('/Notes/Add', command);

为了完整起见,我的域 确实 需要本地时间和偏移量。

原文由 XwipeoutX 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 876
2 个回答

假设您有某种包含 Date 的对象:

 var o = { d : new Date() };

您可以覆盖 Date 原型的 toJSON 函数。在这里,我使用 moment.js 从日期创建一个 moment 对象,然后使用不带参数的 moment 的 format 函数,它发出包含偏移量的 ISO8601 扩展格式。

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

原文由 Matt Johnson-Pint 发布,翻译遵循 CC BY-SA 3.0 许可协议

我总是倾向于不混淆系统对象原型中的函数,比如日期,你永远不知道什么时候它会在你的代码中以一些意想不到的方式出现。

相反,JSON.stringify 方法接受您可以提供的“替换”函数( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#The_replacer_parameter ),允许你要覆盖 JSON.stringify 如何执行其“字符串化”的内部结构;所以你可以做这样的事情;

 var replacer = function(key, value) {

   if (this[key] instanceof Date) {
      return this[key].toUTCString();
   }

   return value;
}

console.log(JSON.stringify(new Date(), replacer));
console.log(JSON.stringify({ myProperty: new Date()}, replacer));
console.log(JSON.stringify({ myProperty: new Date(), notADate: "I'm really not", trueOrFalse: true}, replacer));

原文由 Shawson 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题