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

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

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

但是我总感觉有点问题,特此在 v2 站点寻求一点处理方案,看看各位大佬,有没有好的解决办法😅
1846 次点击
所在节点    程序员
43 条回复
wangtian2020
14 小时 34 分钟前
沙雕后端拉出来打一顿,正确的设计是数据库一律存时间戳,时间戳又没有时区的概念。HTTP 中的时间字段也一律传递时间戳,前端 dayjs 控制显示可太方便了
charlie21
14 小时 27 分钟前
server date
数据库
项目默认时间
数据表条目,都 utc

对于日期读取很频繁的数据,在数据表设置 date_id 和 utc_date_id 栏位,int unsigned 数字类型,用于记录当地日期和 utc 日期 (比如 20241231)
masterclock
14 小时 21 分钟前
搞时间的么,先看看 https://github.com/kdeldycke/awesome-falsehood?tab=readme-ov-file#dates-and-time
基本上:
1. 一律 UTC
2. 人输入的时间未必对应、或仅对应一个时间点
xuanbg
14 小时 3 分钟前
只要你使用统一的时区存储数据,那不同时区用户的时间问题就是一个纯前端问题
shyangs
13 小时 52 分钟前
編碼一律 UTF-8, 時區一律 UTC.
ssgooglg
12 小时 37 分钟前
直接存时间戳 返前段时解析带上系统时区再显示
csys
12 小时 35 分钟前
取决于需不需要 i18n ,如果不需要 i18n ,那就应该把所有环境时间统一设定为+8
如果需要 i18n ,那就所有环境时间统一设定为 utc
hackroad
12 小时 30 分钟前
一律 UTC 0
br_wang
12 小时 7 分钟前
数据唯一性。终端上数据按哪种规格显示,是终端的事。
thetbw
11 小时 46 分钟前
你操作系统配置好时区,包括服务器,开发中一般用时间戳都是自动转换,例如 jdbc 的时间戳转换为 Java 的 Date ,然后 format 到前端显示。我猜你就是操作系统时间戳没有配置,所以按照 UTC 标准时间来了
dlam007
11 小时 44 分钟前
做境外开发的回答下。
可以了解下 i18n 和 icu ,还有 tzdate 这套。都有标准方案和工具的。

存储侧:一般都是数据库存时间戳。
传输侧:客户端当地时间,需要转换为时间戳,传递给后端。
展示测:也就是客户端,需要获取用户的时区、region 信息(手机系统获取,用户 app 设置,经纬度之类的),然后转换成当地时间展示。
Yanlongli
11 小时 38 分钟前
首先,数据库有些类型是支持时区的,那就会按客户端选择的时区展示(不同时区返回不一样的时间值),客户端不指定时按服务配置的时区展示。对于不包含时区的类型,需要定一个固定且统一的时区,需要其它时区时根据固定时区进行加减。int 存储时一律按 UTC 存储,转换时可以指定时区,不要说不指定时区时(默认 UTC )显示的少 8 个小时,因为这个不是北京时间自然少,不要错把 UTC 时区时间当作北京时区时间。
julyclyde
11 小时 5 分钟前
还有就是需要区分数字时区和地名时区,这俩可不是完全一致的
涉及到夏令时等行政更改的问题
2015 的时候朝鲜曾经改到 8.5 后来又改回 9
Configuration
10 小时 57 分钟前
数据库都是存 UTC

timestamp without time zone
standchan
10 小时 54 分钟前
存 utc ,用的时候再根据业务再处理。简单方便
p1gd0g
8 小时 20 分钟前
用时间戳,别用 +- 小时,小心算出负数
viking602
8 小时 8 分钟前
时间戳就好了 前端自己处理这个问题
fantasy0v0
8 小时 3 分钟前
我用的 pg 库直接存 timestamp ,代码处理也是用 OffsetDateTime 等支持时区的类来处理,返回给前端的时候也会带上时区信息,前端自己再根据时区转换并展示(有现成的库来处理)。
0xD800
8 小时 1 分钟前
我现在遇到比这个更麻烦的问题,应用服务器和 minio 服务器时间有差异导致生成不了 presignurl👿👿 等时间同步对了 又可以生成绩😨😨
nivalxer
7 小时 51 分钟前
api 接口返回给前端的时间类型统一用时间戳,目前暂时是这么处理的。

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

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

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

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

© 2021 V2EX