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

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

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

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

9234 次点击
所在节点    Node.js
58 条回复
CEBBCAT
2022-09-24 20:10:57 +08:00
20 层楼了,还没有人说 int(11) 的问题吗?
CEBBCAT
2022-09-24 20:15:32 +08:00
之前我也是像教科书上那样写的,存 datetime 。后来工作的公司在多个国家都有服务,所以学到了存 UNIX 时间戳的方式。MySQL 存的是 BUGINT ,无符号。

关于我楼上说的,int(11),是建表之后查建表结构然后显示的那个是吗?楼主可以 Google 一下,这个 11 不影响存储的
CEBBCAT
2022-09-24 20:16:07 +08:00
@CEBBCAT BIGINT 😄
twinsdestiny
2022-09-24 21:09:41 +08:00
@CEBBCAT 你确定 int(11)能存下 13 位时间戳?不然楼主除 1000 干嘛
humbass
2022-09-24 21:10:48 +08:00
@reter new 出来不会有负数,一般记录的时间肯定当前系统、用户生成的时间。
chenqh
2022-09-24 21:25:47 +08:00
存 0 时区的 datetime,mysql 类型 datetime,用 biginit,太难运维了
triptipstop
2022-09-24 21:29:47 +08:00
小时候用 TP 存的都是时间戳,后来长大了用的 LV 存的就是 datetime ,这样看起来更优雅,用户面向全球,服务器设置成 0 时区,在客户端转换时区。
dcsuibian
2022-09-24 21:43:21 +08:00
周经贴,unsigned long ,存毫秒级时间戳
JavaScript 里的数字都是 double ,但不超过 2^52 应该都是安全的
fuchish112
2022-09-24 22:13:01 +08:00
datetime,方便查看
timestamp,需要时区的话,用这种
CEBBCAT
2022-09-24 22:16:05 +08:00
@twinsdestiny 我既然发出来了,那自然说明有一定自信。但为了防止误人子弟,我又去确认了一遍。int(11)中的 int 决定了存储空间,11 则是和 ZEROFILL 配合的,只影响显示。

随附两个参考链接
1. https://stackoverflow.com/q/5634104
2. https://www.cnblogs.com/polk6/p/11595107.html

我觉得不应该这么自大和冷漠
ychost
2022-09-24 22:19:56 +08:00
最好存自己时区的数据到数据库,方便排查问题,其它时区只需要前端做一层转换就好了
ericls
2022-09-24 22:20:09 +08:00
存未来的时间还是 string 好
ladypxy
2022-09-24 22:27:52 +08:00
转换成 UTC Unix timestamp
baobao1270
2022-09-24 22:37:24 +08:00
@Livid 时间戳有可能出现负数:比如存用户的生日,而用户生日可能在 1970 年之前。这些在设计表的时候都是要考虑的。
james2013
2022-09-24 22:39:22 +08:00
那些说时区问题的,又不是国际软件?
在本地,测试,正式服设置一次 mysql 配置,使用 datetime 就可以了
Features
2022-09-24 22:43:18 +08:00
我存俩,一个 datetime,一个 uint
就是读取的时候免得转来转去的
humbass
2022-09-24 22:55:02 +08:00
@CEBBCAT 多谢!

一直不知道扩符号里头的 11 代表啥,我按实际需求的 int 位数写;
那就是说:如果想存 unix time 在 int 里头,还是需要将 new Date().getTime() / 1000 , 是这个意思吗?
humbass
2022-09-24 22:59:06 +08:00
@baobao1270 说到生日这个使用点了,确实有这个需求,还是不能直接使用 unsigned int @Livid
codehz
2022-09-24 23:04:10 +08:00
关于 unix 时间戳的几个错误认知:
1. unix 时间戳表示从 UTC 1970 年 1 月 1 日 0 时 0 分到现在的秒数,错❌
2. 等待一秒后 unix 时间戳+1 ,错❌
3. 那么最起码,unix 时间戳不会递减,错❌
关于时间格式的几个错误认知:
1. 24:12:34 是一个非法的时间,错❌
2. 每一个整数都是一个可能的年份,错❌
3. 同一时间的年份在任何时间格式下都是一样的数字(如果有),错❌
4. 每月的日数在 28 到 31 之间,错❌
5. 星期六之前一定是星期五,错❌
6. 时区之间的差异最短是 15 分钟,错❌
7. 时区一定是到 UTC 到固定时间差异,错❌
8. 下一个星期的同一时间一定是当前时间+7*864000 秒,错❌
9. 你可以设计一个更好的时间系统,错❌
codehz
2022-09-24 23:12:24 +08:00
正经回答一下好了,存时间就别限制位数了,数据库也不差这么点,32 位时间戳很快就会撞到 2038 了(虽然数据库用十进制的倒是问题不大,但是这种莫名其妙的 11 的限制不会有啥好处)
不过其实如果不是性能非常要紧的话,存 iso8601 就足够用了(数据库自带时间类型,可以自动转换的就忽略这点),主要除了程序处理,有时候还需要人工检查问题的,看时间戳不如看可读性好的文本

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

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

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

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

© 2021 V2EX