比较好奇大家时间都是怎么存数据库的

2022-09-24 15:18:01 +08:00
 humbass

目前我的项目都是直接使用 UTC 时间戳存,但是时间戳是 13 位的,所以除 1000 后,以 int(11) 的方式存

主要是担心数据库有时区问题,造成时间有差异

9188 次点击
所在节点    Node.js
58 条回复
Livid
2022-09-24 15:20:10 +08:00
V2EX 的所有时间也是这么存的——Unix Timestamp

而且因为时间戳不会出现负数,所以用的是 unsigned int
JamesR
2022-09-24 15:21:27 +08:00
直接存整型。
jybox
2022-09-24 15:25:06 +08:00
大多数据库的时间类型,都是收到带时区的时间后,内部转换为不带时区的时间存储(一般是 UTC 时间戳),在客户端查询时再根据客户端的要求转换到指定的时区显示,所谓「时区问题」只是读写时数据库或客户端 library 没有正确配置。当然如果业务需要关注每一行数据的时区的话,可以单独用一个字段来存时区。
dqzcwxb
2022-09-24 15:28:08 +08:00
问个问题,数据库为什么要设计出 date 和 dateTime 数据类型?
thinkershare
2022-09-24 15:36:11 +08:00
@dqzcwxb 很多场景不需要 Time, 只需要日期,例如生日这种, 这样日期的有效范围可用很小, 然后是要更小的字节长度来存储。 而且一些语言中也有 Date 类型和 Time 不同的类型, 还有合起来的 DataTime 类型。
wxf666
2022-09-24 15:39:02 +08:00
肯定存时间戳啊

时区问题这么复杂,你确定数据库真的都能处理好了?

万一以后中国又实行夏令时,你数据库咋处理。。
go522000
2022-09-24 15:56:37 +08:00
以前用 unsigned int ,后来新项目我一般都是用 datetime 类型。就单纯觉得在数据库工具中直接查看比较方便而已。
Akitora
2022-09-24 15:58:16 +08:00
datetime ,方便查看
zilongzixue
2022-09-24 16:19:43 +08:00
存 long 类型的时间戳,要用的时候加上时区
iseki
2022-09-24 16:27:31 +08:00
按 PostgreSQL FAQ 里的最佳实践,用 timestamp with time zone ,如果需要时区信息就单独开个字段存 IANA 时区数据库里的时区 ID
Aloento
2022-09-24 16:27:57 +08:00
PG 自带时间类型,所以直接用内置 UTC 时间类型就行了
nanmu42
2022-09-24 16:31:48 +08:00
如果你用的是 PG ,我写过一篇文章,希望对你有帮助:

学会和 PostgreSQL 的时间数据类型愉快玩耍
https://nanmu.me/zh-cn/posts/2020/postgresql-date-and-time-data-types-explained/
dswyzx
2022-09-24 16:38:26 +08:00
mongodb 这样的不支持 datetime,mysql 之流则支持 datetime 类型存储字段.
如果一个项目考虑跨时区,那么考虑时区转换问题,如果一个项目等到删库都没变过 utc+8:00,还是在 mysql 这种有 datetime 类型的数据库里,天天对着一长串时间戳排查 db 数据的时候那就只能开着个网页专门转换时间戳了.毕竟人脑识别 datetime 比 long 强
leonshaw
2022-09-24 17:53:54 +08:00
以前用 Hibernate 时候吃过时区的亏(有两个 CST ),后面时区信息都是另外存。
waising
2022-09-24 17:58:56 +08:00
@iseki #10 数据都是同一个时区下是不是用 timestamp 更好
moen
2022-09-24 19:19:24 +08:00
@waising 不好,without timezone 的情况下需要保证客户端输入的是 UTC ,否则容易出错。显然还是让 dbms 自己处理时区更能减少问题
Cbdy
2022-09-24 19:22:34 +08:00
时间戳或者 ISO8601
myd
2022-09-24 19:30:34 +08:00
性能的瓶颈通常不在于 int 和 datetime ,所以我选择可读性更好的 datetime 。如果涉及到时区,就用时间戳。
Jirajine
2022-09-24 19:35:09 +08:00
大部分应用不需要也不应该处理、存储时区信息,用户发表了一个 post ,你只需要知道该 post 发布的“绝对时间”,没必要去记录用户是用什么时区发布的。

“时区”只是作为时间信息输入 /输出 解析和格式化的时候的一项参数,与时间信息本身无关。就像存一个整数不需要关心它是 16 进制还是 10 进制、如何 padding 如何对齐,这些只是显示和解析时的参数。
reter
2022-09-24 19:48:09 +08:00
#1 @Livid 说的并不正确,时间戳会出现负数,并且负数表示 1970 年 1 月 1 日之前的时间,所以不适合用无符号,应该用有符号。

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

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

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

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

© 2021 V2EX