遇到的现象
let newObj = JSON.parse(JSON.stringify(obj))
,假设对象obj
有属性time
:
如果time
的值是new Date()
, 则newObj
得到的拷贝后的数据属性time
时间与当前北京时间会差8小时。如果time
的值是new Date().getTime(); //获取当前毫秒时间戳
, 则newObj
得到的拷贝后的数据是没有问题的。
时间戳是什么?
时间戳是指格林威治时间1970年01月01日00时00分00秒
(北京时间1970年01月01日08时00分00秒)
起到现在的总秒数。是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。
看一个例子:
console.log(new Date());//北京时间 中国标准时间console.log(JSON.stringify(new Date())); //UTC时间console.log(JSON.parse(JSON.stringify(new Date()))); //UTC时间console.log(new Date(JSON.parse(JSON.stringify(new Date()))));//北京时间 中国标准时间console.log(new Date(JSON.parse(JSON.stringify(new Date()))).toLocaleString());//北京时间 中国标准时间console.log(new Date().getTime());//时间戳console.log(JSON.stringify(new Date().getTime()));//时间戳console.log(JSON.parse(JSON.stringify(new Date().getTime())));//时间戳console.log(new Date(JSON.parse(JSON.stringify(new Date().getTime()))));//北京时间 中国标准时间console.log(new Date(JSON.parse(JSON.stringify(new Date().getTime()))).toLocaleString());//北京时间 中国标准时间
浏览器控制台可以尝试输出以上内容,观察现象带着疑问看看下面几个概念!
new Date()
返回值
返回类型为国标时间无参数时可以直接返回输出时的时间有参数时则返回对应时间的国标时间内置方法
Date - w3school
GMT(格林尼治标准时间)
格林尼治标准时间(Greenwich Mean Time,GMT)
是指位于伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。 理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时的时间。由于地球在它的椭圆轨道里的运动速度不均匀,这个时刻可能和实际的太阳时相差16分钟。 地球每天的自转是有些不规则的,而且正在缓慢减速。所以,格林尼治时间已经不再被作为标准时间使用。格林尼治标准时间UTC(世界标准时间)
协调世界时是零时区的时间是时间协调时间UTC+8(北京时间)
北京时间北京时间是中国采用国际时区东八时区的区时作为标准时间。UTC+8
其实在文章最初抛出的现象的疑问可以解答了:
let newObj = JSON.parse(JSON.stringify(obj))
,假设对象obj
有属性time
: 如果time
的值是new Date()
, 则newObj
得到的拷贝后的数据属性time
时间与北京时间会差8小时,JSON
反序列化时间格式的数据时候,会在内部以UTC
时间为标准进行转换,与北京时间差8小时也是正常现象。