关于软件开发中的跨地区的时区问题

13 小时 42 分钟前
 kushu001
在最近的开发过程中,发现数据库服务器的时间是比北京时间少 8 小时的,所以存数据的时候,时间字段自动扣减了 8 小时。

因为这个现象,我突然想到跨时区的应用在处理这样的时间问题,一般都是怎么处理的,有点不太理解
目前看到的一个方案是,数据库和应用服务器都处理标准时间,不同时区的客户端自行解析时间?

但是我总感觉有点问题,特此在 v2 站点寻求一点处理方案,看看各位大佬,有没有好的解决办法😅
1811 次点击
所在节点    程序员
43 条回复
2han9wen71an
13 小时 40 分钟前
时间戳
ashong
13 小时 39 分钟前
存 utc
Plutooo
13 小时 38 分钟前
你看到的方案没问题,服务端只返回时间戳给客户端,客户端根据用户时区自行解析
ivvei
13 小时 38 分钟前
你感觉有点问题,什么问题?
lbunderway
13 小时 37 分钟前
utc
cowcomic
13 小时 34 分钟前
要是就是针对一个时区内的开发,那就全部统一成这个时区,比如就开发国内的东西,那就都用东八区
要是开发一个系统涉及多时区共用,那就是后台统一成标准时间 UTC ,然后前端再去自行改变,可以通过定位或者子域名或者目录层级都可以。
要是系统庞大涉及跨区域独立部署,那中央机房保持 UTC ,其他各时区独立部署的可以设置对应时区,再在数据同步时进行归一
kushu001
13 小时 30 分钟前
@ivvei 只是感觉,说不上来,如果后续要进行数据分析,是不是会比较困难?我看数据库里存 timestamp 好像也没有时区的显示啊,是要另外做一个字段显示?
nzynzynzy
13 小时 22 分钟前
数据处理储存一定用 UTC ,不要搞这种减八小时。很多地方都有夏令时冬令时的切换,这个时差可能随时+1 / -1
barrywey
13 小时 15 分钟前
服务端的程序,以及数据存储,永远都使用 UTC ,已 UTC 为基准。

应用(浏览器、客户端等)请求数据的时候,根据所处的地区自己转换为本地时间。

应用和服务端之间传输数据的过程,还是已 UTC 为准。
ksedz
13 小时 11 分钟前
时间戳或者 UTC ,需要注意的是有些 orm (不仅仅是数据库)会自动根据时区进行转换,需要处理下。
zeromake
13 小时 7 分钟前
@barrywey 然后一往 db 里塞了发现 db 有自己的时区()
esee
13 小时 5 分钟前
都是存储和返回时间戳给客户端自己解析的。。纯数字的时间戳才方便做各种分析
barrywey
13 小时 0 分钟前
@zeromake 数据库也要 UTC ,或者干脆整个服务器都配置成 UTC
rocmax
13 小时 0 分钟前
timestamp 是绝对的,日期和本地时间是相对的。如果服务器和客户端无法强制统一时区,则系统测一律使用 utc ,客户端按照本地时区转换。
浏览器提供了本地时区检测 api ,
vczyh
12 小时 59 分钟前
数据库怎么存和服务保持一致就行,服务返回给渲染层按照 ISO8601 https://en.wikipedia.org/wiki/ISO_8601 来,这个我觉得比时间戳直观。
rocmax
12 小时 59 分钟前
@rocmax 同时也应该提供手动切换选项。
前一阵用 nextjs 开发 app ,服务端渲染时时区更是个麻烦事,需要客户端将时区存在 cookie 里,服务端根据客户请求渲染页面。
Mithril
12 小时 44 分钟前
存储不要用 UTC ,用 DatetimeOffset ,主要是相比 UTC ,它有个时区的偏移量。
这样你能知道你这条数据,是从哪个时区生成的。特别是你在同一个服务器中处理不同时区发过来的数据时,未来你如果想要显示这数据生成时的本地时间,那你存 offset 会省很多事。你如果只存 UTC ,等你加了这需求的时候会有大把的数据显示不正常。所以如果你做跨国的应用,不如从开始就存 offset 。
然后所有程序中处理的时候都用它来做,最终显示的时候再转换回本地时区。
zeromake
12 小时 37 分钟前
@barrywey 然后联系运维,运维说是云的数据库,改起来太麻烦了……
dode
12 小时 35 分钟前
所有的中国服务器,软件,环境变量等配置好东八时区
nekochyan
12 小时 35 分钟前
我们现在是直接服务器是 0 时区,直接 UTC 存储,然后再配置一个业务要跑在哪个时区字段偏移量,所有业务算时间用统一接口会加上这个偏移量去计算,客服端同理用服务器下发的偏移量计算;这样可以跑在任意时区,避免夏令时问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1093598

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX