2021 年了,数据存时间是用 utc 还是本地时间?

2021-07-13 14:09:55 +08:00
 0x0208v0

本来自己打算用 UTC 存,结果手欠百度了一下,结果发现用什么存储的都有。 现在乱了,不知道怎么存了,求大佬帮忙打醒

12926 次点击
所在节点    程序员
89 条回复
Cy1
2021-07-13 18:05:47 +08:00
直接时间戳,各端根据时区自己格式化显示。
cmdOptionKana
2021-07-13 18:29:40 +08:00
看来关心时区问题的人不多呀,一大堆说时间戳……

时间戳也分 “UTC” 时间戳和 “本地时间” 时间戳的好吗。
BenX
2021-07-13 18:36:19 +08:00
UTC 秒数存下来,至于使用端的逻辑,看那一层处理了。 时间戳,跨时区不是自找麻烦
libook
2021-07-13 18:43:55 +08:00
看需求。

如果你有个强大的数据库,那么可能怎么存时间无所谓。
如果数据库不够强的话:

如果你的服务只在一个时区开展的话,用本地时间记录可以方便数据的统计分析;

如果希望跨时区的话就最好用 UTC ;

用 ISODate 格式的话方便于根据日期查询;

用时间戳格式便于进行数学计算;

……

没有银弹。
chenqh
2021-07-13 18:53:25 +08:00
@CEBBCAT biginit 应该就够了吧, unsigned bigint?
Yut
2021-07-13 18:58:12 +08:00
那肯定是 Unix 时间啊,存其他的都有可能要转两道
tooya
2021-07-13 18:59:53 +08:00
@libook 直接都存,空间换时间(
gtexpanse
2021-07-13 19:06:04 +08:00
@cmdOptionKana #23 时间戳本身是没有时区概念的,只是他要基于 UTC1970 年这个基准而产生。
使用时间戳来交互的方便之处在于,给出一个时间戳,不论你处于哪个时区,这个时间戳表示的时间点基准点的秒数都是相同的,也就是说时间的长度是固定的,但你拿时间戳想转换为“时间”的时候是必须要带入时区概念的——可以想象成尺子的长度是固定的,但是想看最终的读数必须要带入时区。
qiayue
2021-07-13 19:10:58 +08:00
@cmdOptionKana 时间戳是唯一的,不存在 UTC 时间戳还是本地时间时间戳。
时间戳的定义式从 1970 年 1 月 1 日零点到现在经过的秒数。

时间戳可以格式化为各地时间,如时间戳 0 值,你格式化为 UTC 时间,就是 1970 年 1 月 1 日 0 点,你格式化为北京时间,就是 1970 年 1 月 1 日 8 点。
mxT52CRuqR6o5
2021-07-13 19:13:46 +08:00
@cmdOptionKana 时间戳没有时区的,时间戳转为年月日是需要考虑时区
SuperMild
2021-07-13 19:17:53 +08:00
@gtexpanse 我没说清楚,我本来想说就算用时间戳,也有 “直接用本地时间转时间戳” 与 “先转 UTC±00:00 再转时间戳” 两种做法。

因为,如果每个客户端都先转 UTC±00:00, 按这个统一转时间戳,就能兼顾时区了。

按我理解,楼主主要想问的是要不要处理时区,而回答 “用时间戳” 是回答不了 “要不要处理时区” 这个问题的,因为用时间戳既可以处理时区(方法是统一转 UTC±00:00 ),也可以不处理时区。
crclz
2021-07-13 19:20:37 +08:00
首先,存到数据库里面的东西都要标准化,所以统一使用 UTC 时间。

建议统一使用 int64 UTC milliseconds. 当然 int64 UTC seconds 也行,只不过都是 int64,不会省空间的。

还有就是要注意,避免在 ORM 的实体上面使用语言自带的日期类型,例如 C#的 DateTime 、DateTimeOffset,例如 Java 的 Datetime 。虽然看起来方便,但是最终会付出额外的成本。

keep it simple and stupid. 这虽然笨了点,但是却能够避免很多问题,并且别人也更加容易看懂你的代码。
cmdOptionKana
2021-07-13 19:22:30 +08:00
@gtexpanse
@qiayue
@mxT52CRuqR6o5 怪我没说清楚,具体请看 #32 (刚刚不小心用小号 SuperMild 回复了)
tokyo2021
2021-07-13 19:56:56 +08:00
1 看了前面很多,感觉有的也没理解啥是时间戳的概念呀, 我一直做海外游戏后端,稍微了解一点。
时间戳 故名思义 表示戳记, 记录 1 个事件发生时的时间戳记
举个例子: 当抵达上海的入境海关,给你护照上盖个时间戳,这是中国 cst 时间,时间格式是 ISO 那个 8644(好像是)格式, 抵达东京的海关入境时护照上面当然也会盖一个时间戳,这是东京时间,时间格式又是 1 种,他们的时间格式。
你手机拍的照片, 同时也会存储拍照时的时间戳记,
那计算机通常采用 unix timestamp 存储时间戳记。 一般是从 1970 年 1 月 1 日 0 时至今的秒数。 为啥 1970 年呢, 应该是 unix 系统就是 1970 年正式发布诞生,选择就从 1970 年开始记吧。UTC 世界协调时,啥原子能机构授时的机构发布,严谨的来说不要在 UTC 上面表示+- 时区,UTC 就是世界协调时。 一般+- 是 GMT +1, GMT -2,本地时间和 GMT 的偏差,PST,PDT,和 GMT 时间做转换,还有海洋时间等等

2 觉得如果是 mysql 数据库,最好使用 datetime 格式, 做时区存储 (公元 0000 到 9999 年时间),SQL 查询(自带丰富的时间函数), 转换(天数加减)非常的方便。mysql 8.0.19 版本以来,支持插入的时间可以带上偏移的参数,支持多个时区的数据插入到同 1 个数据库,这样始终存储的是同 1 个时区的时间。

3 觉得时间特别容易引起 bug, 当年 iPhone 就因为时间存储问题,变成砖了~
lix7
2021-07-13 20:15:17 +08:00
永远都存毫秒级时间戳
SingeeKing
2021-07-13 20:40:19 +08:00
@SuperMild 先转 UTC0 的唯一「好处」是浪费了点时间…
oooooooooooo
2021-07-13 20:55:41 +08:00
@cmdOptionKana
@SuperMild

顶级理解
ngn999
2021-07-13 22:08:22 +08:00
我理解是应该存下时刻, 展示时, 把时刻转到相应的时区就好了.
akira
2021-07-13 22:13:30 +08:00
看你的用户群体
cmdOptionKana
2021-07-13 22:20:04 +08:00
@SingeeKing
@oooooooooooo 是我理解错了,感谢指正!

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

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

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

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

© 2021 V2EX