遇到的现象
-
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()
返回值
- 返回类型为国标时间
- 无参数时可以直接返回输出时的时间
- 有参数时则返回对应时间的国标时间
内置方法
方法 | 描述 |
---|---|
new Date() | 返回Sat Feb 21 2023 20:26:12 GMT+0800 (中国标准时间) |
getFullYear() | 获取四位的年(yyyy) |
getMonth() | 获取月(0-11) |
getDay() | 以数值获取周名(0-6) |
getDate() | 以数值返回天(1-31) |
getHours() | 获取小时(0-23) |
getMinutes() | 获取分(0-59) |
getSeconds() | 获取秒(0-59) |
getMilliseconds() | 获取毫秒(0-999) |
getTime() | 获取时间(从 1970 年 1 月 1 日至今的毫秒数) |
toLocaleString( ) | 获取日期与时间 (如:2023/2/21 20:43:23) |
toLocaleDateString() | 获取日期 (如:2023/2/21) |
toLocaleTimeString() | 获取日期与时间 (如:20:43:23) |
getUTCDate() | 根据世界时,返回月份中的第几天(从 1 到 31) |
getUTCDay() | 根据世界时,返回星期几(0-6) |
getUTCFullYear() | 根据世界时,返回年份 |
getUTCHours() | 根据世界时,返回小时(0-23) |
getUTCMilliseconds() | 根据世界时,返回毫秒数(0-999) |
getUTCMinutes() | 根据世界时,返回分钟(0-59) |
getUTCMonth() | 根据世界时,返回月份(0-11) |
getUTCSeconds() | 根据世界时,返回秒数(0-59) |
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小时也是正常现象。
- 如果