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

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

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

12962 次点击
所在节点    程序员
89 条回复
paulw54jrn
2021-07-13 23:04:35 +08:00
Epoch 或者 UTC iso8601
realradiolover
2021-07-13 23:37:10 +08:00
UNIX 时间戳是绝对的。其度量基准为:从伦敦时间 1970 年 1 月 1 日 0 时开始,到此刻的秒数。

在某一时刻,全球不同地区时区不同,因此钟表时间也不相同(“时差”的来源),但 UNIX 时间戳是一致的。e.g.: 此刻,是北京时间 23:08:00,伦敦时间 15:08:00,美国东部时间 11:08:00,但此刻三个地方的 UNIX 时间戳都是 1626188880 。

同样道理,你获得此刻的 UNIX 时间戳,在全球不同时区,翻译得到的时间也是不同的;几乎所有的操作系统都有“区域,语言”之类的配置项,就是为了根据你的设备所在的时区,来翻译出“合适”的时间。e.g.:手机的“时钟”APP 通过 ntp 授时服务获得此刻的 UNIX 时间戳 1626188880,然后检查手机系统配置的“区域”,如果此刻你在上海,那么时钟显示“23:08:00”;此刻,你在夏威夷的同学,他的手机时钟 APP 也得到了同样的 1626188880,但他的系统区域设置是夏威夷,那么时钟将显示太平洋时间“05:08:00”

由此可见,各国日常生活所使用的时间是不过是表象,是相对的。这是为了照顾人们的生活习惯,午夜一定是 0 点,正午一定是 12 点。因此全球需要一个绝对的基准,一般用 UTC 来度量,计算机科学则使用 unix timestamp.


PS:基于北京时间的时间戳,本身就是一个伪命题。时间戳只有一个全球的绝对的。早期照片文件 EXIF 信息就忽略了这一点,只存了文本而没有时区。造成时间转换的混乱
smallthing
2021-07-13 23:41:17 +08:00
@cmdOptionKana 所谓本地世界的时间戳 就是一个错误的时间戳罢了。
cszchen
2021-07-13 23:49:48 +08:00
mysql 用 timestamp pgsql 用 timestamptz,都带有时区,根据客户端时区转换
acmore
2021-07-14 00:32:54 +08:00
把时区带进数据库中给人的感觉就像把前端样式存在数据库了一样。
很多时候没啥不行,说不定还很好用,但是让人浑身不自在。
jupiter157
2021-07-14 03:30:15 +08:00
时间戳是强制换算到 utc0 的,和楼主存 utc0 时间有差别吗?前者是毫秒,对机器友好,后者所见即所得,对人类友好。反正别存本地时间,如果实在必须,可以存成字符串后面永远带着时区的尾巴。
jupiter157
2021-07-14 03:44:35 +08:00
楼主存 6 个,是下下策,原因有三。1 ) 5 个信息冗余,换来的优点是可以节省转换时间,调用可以没有格式要求; 2 )时间转换效率是会随着硬件和软件提升不断改善的,节省的时间会越来越少; 3 )冗余的数据会越来越多,如果有天想删了,发现不同的程序调用的格式都不一样。
qfdk
2021-07-14 04:21:45 +08:00
ISO8601 然后前端用 dayjs 这样的库来显示
ericls
2021-07-14 04:25:46 +08:00
存未来的时间只能用 string
sutra
2021-07-14 08:36:49 +08:00
当你使用本地时间存储时,需要考虑时区、夏令时。
bxb100
2021-07-14 08:44:23 +08:00
只要存储的信息里面包含(隐式 /显式)时区信息, 那么最终的展示应该根据 local zone 来计算, 不要预先考虑 DST/WT/ST, 最终转换使用工具类即可
Mithril
2021-07-14 08:49:02 +08:00
只要你不想知道这数据是从哪个时区生成的,那你可以直接存 UTC 或者时间戳。
否则直接 ISO
liuidetmks
2021-07-14 08:52:33 +08:00
@cmdOptionKana 时间戳就是格林威治时间,各个时区都是一样的吧?
cmdOptionKana
2021-07-14 08:58:31 +08:00
@liuidetmks 是一样的,我理解错了。幸好参与了讨论,不然我都没发现自己错误(因为我的做法也不会导致结果出错,所以靠自己很难发现)。
Cbdy
2021-07-14 09:01:37 +08:00
timestamptz 不好吗?
p1gd0g
2021-07-14 09:06:06 +08:00
看到有人说时间戳加时区的,忍不住说两句。
我们做海外手游的,客户端曾经因为时间戳加了时区导致时间戳结果为负数,直接闪退。
SilentDepth
2021-07-14 09:06:38 +08:00
完全没想到楼主最终选择的方案是全都存,而且存 6 种……

存 UTC 就得了,或者存带时区的 ISO8601 (取决于是否需要保留初始时区信息)。想不到有什么问题是解决不了的。
egfegdfr
2021-07-14 09:11:31 +08:00
存时间戳的 不考虑可读性吗? 每次查问题,或者是直接在数据库里面查数据的时候 都需要 format 一下,不累吗
直接时间格式不香吗, 能后时区问题的话,可以存 utc 时间,能后根据时区转换
falcon05
2021-07-14 09:13:45 +08:00
WordPress 的 posts 表还真的是把 gmt 和本地时间都存了一份。
Ariver
2021-07-14 09:21:04 +08:00
建议对这个概念不太清楚的把楼上回复仔细看完。
时区这个概念对于稍微有点经验的开发都是必须掌握的。

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

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

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

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

© 2021 V2EX