当前位置:嗨网首页>书籍在线阅读

09-传递日期

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

15.6 传递日期

随着传递日期(不管是服务器给浏览器传送日期还是反过来)的出现,事情开始变得有趣起来。服务器和浏览器可能处于不同的时区,而用户也想使用本地时间。幸运的是,JavaScript的Date实例存储的是距离Unix新纪元UTC时间的毫秒数,所以通常情况下,反复传递Date对象是安全的。

对于“传递”这个词的意思似乎有些模棱两可,那么它究竟是什么意思?确保日期被安全传递的最可靠方式是使用JavaScript对象表示法(JavaScript Object Notation__,也就是常说的JSON)。然而遗憾的是,在JSON中使用日期会破坏JSON的对称解析特性,因为JSON规范中并没有支持日期的数据类型:

const before = { d: new Date() };
before.d instanceof date                      // true
const json = JSON.stringify(before);
const after = JSON.parse(json);
after.d instdanceof date                      // false
typeof after.d                                // "string"

也就是说,在JavaScript中,JSON不能无缝且对称地处理日期。不过幸运的是,JavaScript中的序列化字符串功能能够始终保持数据的一致性,所以可以从字符串中“恢复”一个日期。

after.d = new Date(after.d);
after.d instanceof date          // true

不论一开始用什么时区去创建日期,当它被编码成JSON的时候,它使用的都是UTC时间,同时,当这个JSON格式的字符串传给 Date 构造器的时候,其中的日期都会被转换成当地时区然后显示出来。

另一个在客户端和服务端之间安全传递日期的方式是简单地使用日期的数字值:

const before = { d: new Date().valueOf() };
typeof before.d                               // "number"
const json = JSON.stringify(before);
const after = JSON.parse(json);
typeof after.d                                // "number"
const d = new Date(after.d);
JavaScript将日期编码成JSON字符串后能够始终保持一致,这是其他语言和平台提供的JSON类库所不具备的特性。在.NET中,JSON序列化器会按照它们自己专有的格式序列化日期对象。所以如果与其他系统的交互是通过JSON来进行的,你就要留心其序列化日期的方式。如果可以操作源代码,最好使用基于Unix新纪元偏移量的数字传递日期。除此之外,你还是要格外小心:因为日期类库通常使用秒作为日期的数值,而非毫秒。