当前位置: 首页 > 知识库问答 >
问题:

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

胡星汉
2023-03-14

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

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字符串的最佳方法是使用矩。js和使用<代码>矩。format()。内部字符串化(在本例中为AngularJS)

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

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

共有3个答案

方楷
2023-03-14

基于Matt Johnson的回答,我重新实现了toJSON,而不必依赖于瞬间(我认为这是一个很棒的库,但像toJSON这样的低级方法中的依赖性让我感到困扰)。

Date.prototype.toJSON = function () {
  var timezoneOffsetInHours = -(this.getTimezoneOffset() / 60); //UTC minus local time
  var sign = timezoneOffsetInHours >= 0 ? '+' : '-';
  var leadingZero = (Math.abs(timezoneOffsetInHours) < 10) ? '0' : '';

  //It's a bit unfortunate that we need to construct a new Date instance 
  //(we don't want _this_ Date instance to be modified)
  var correctedDate = new Date(this.getFullYear(), this.getMonth(), 
      this.getDate(), this.getHours(), this.getMinutes(), this.getSeconds(), 
      this.getMilliseconds());
  correctedDate.setHours(this.getHours() + timezoneOffsetInHours);
  var iso = correctedDate.toISOString().replace('Z', '');

  return iso + sign + leadingZero + Math.abs(timezoneOffsetInHours).toString() + ':00';
}

当提供的值“溢出”时,setHour方法将调整date对象的其他部分。从MDN:

如果指定的参数超出预期范围,则setHours()会尝试相应地更新日期对象中的日期信息。例如,如果使用100表示秒值,则分钟将增加1(分钟值1),40表示秒。

苏振国
2023-03-14

我总是倾向于不要弄乱系统对象原型中的函数,比如日期,你永远不知道这会在以后的代码中以某种意想不到的方式影响你。

相反,JSON。stringify方法接受“replacer”函数(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#The_replacer_parameter)您可以提供它,允许您覆盖JSON的内部。stringify执行其“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));
辛建业
2023-03-14

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

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

您可以覆盖原型的toJSON函数。在这里,我使用时刻。js从日期创建一个力矩对象,然后使用无参数的力矩格式函数,该函数发出包含偏移量的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(); }
 类似资料:
  • 问题内容: 我有一个由用户创建的日期对象,时区由浏览器填充,如下所示: 不过,当我将其字符串化时,时区会再见 在保留浏览器时区的同时获取ISO8601字符串的最佳方法是使用moment.js并使用,但是如果我通过内部使用的东西序列化整个命令(在这种情况下,是AngularJS)当然是行不通的) 为了完整起见,我的域 确实 需要本地时间和偏移量。 问题答案: 假设您有某种包含的对象: 您可以覆盖原型

  • 我必须合并2个json文件,并需要在其中一个文件中保留一个字符串: < code > " weeks ":" weeks \ u00a 0 days " 合并后的 始终更改为空格:

  • 问题内容: 我有一个字符串: 我想用分隔符和一个特殊字符分隔此字符串。 为此,我正在使用: 如何保留定界符? 问题答案: 使用(正)前瞻,以便正则表达式断言特殊字符存在,但实际上并不与之匹配: 实际观看:

  • 我有一个格式化的字符串日期 2020/04/16 (年/月/日) 我想把这个字符串解析成日期时间 显然不起作用,没有正确的日期格式。 有人知道把这个字符串解析成日期时间的最好方法是什么吗?

  • 问题内容: 我有以下字符串(Java 1.5): 我需要一个数组: 用Java最方便的方法是什么? 问题答案: 这将为您提供所需的数组,只有第一项为空。和: 这将使数组没有空的第一项。 此处的关键是零宽度正向超前(非捕获构造)(请参阅regex pattern docs)。 表示“或者;或:” 是字边界的-在那里是为了不将第一个视为定界符(因为它是序列的开头)