跨时区的时间显示
跨时区问题一直是个比较麻烦的问题,在此写下这篇文章算是构建一下思路吧。
client Time or server Time?
我的理解是都行。为什么呢?
因为数据库在存储时间的时候会将时间存为UTC时间与时区,举个栗子:
客服端在中国(UTC+08:00),服务端在日本(UTC+09:00)。
client new Date()
如果我们在客户端创建时间 new Date();//Thu Dec 29 2016 16:54:27 GMT+0800 (China Standard Time),
这时候数据库中存储的是UTC时间+中国时区,前端读取这个值后,进行 new Date("serverTime"),会根据前端所在时区创建时间,所以在哪个时区看到的都是正确的,即中国会看到16:54:27,而日本会看到17:54:27。
server new Date()
如果我们在server端new Date(),数据库会存储数据库的时区,例如Thu Dec 29 2016 16:54:27 GMT+0900 (Japan Standard Time),
这时候前端读取这个值serverTime,进行new Date(serverTime),仍会以前端所在的时区去创建时间,我们在中国会看到15:54:27,日本会看到16:54:27。
所以,时间在client或server端创建不影响前端的显示,ps: 数据库date类型一定要选去DATETIME,DATE是会选取年月日的,前端获取的serverTime是string,一定要进行new Date(serverTime),同时本着前端的信息不可信的原则以及尽量减少数据量的传输的原则,尽量在服务端去创建时间。
以上思考如有错误,尽请斧正~
(づ ̄ 3 ̄)づ
1. 通用做法就是数据库存储采用UTC时间,显示采用本地时间,数据传输采用date类型的数据,这样能保证数据一致性。
2017/01/22
如果数据的类型为date,那么前端传输不要用date类型传输,只要是date类型就会涉及时区问题,所以用字符串传输,在后端new Date()前端传来的参数