为什么要用毫秒值的形式存储日期时间?

2019-04-01 15:38:46 +08:00
 5ispy

哪位帮忙解答一下,实际工作中在哪种情况下,很有必要把时间转换成毫秒值进行存储?

比如某条数据的创建时间,查询的时候不论是程序里还是写 sql 查询还需要转换,很不方便啊,为什么还要用这种数值的存储方式?比存日期类型或者字符串处理速度快?节省空间?

求解答

谢谢!!!

12837 次点击
所在节点    程序员
64 条回复
hirasawayui
2019-04-01 17:30:50 +08:00
@leo108 我曾经遭受了 safari 时区问题的毒打,哈哈哈
reus
2019-04-01 17:33:19 +08:00
用时间类型,可以储存时区等信息
jamesliu96
2019-04-01 17:37:53 +08:00
@Septembers 千古奇才啊
geelaw
2019-04-01 17:43:25 +08:00
@love #13 你需要知道哪些时间点发生了闰秒,以及你需要的时区,以及那个时区在那个时候的夏令时调整。

@webdisk #19 我觉得 @Septembers 和 @rrfeng 以及其他人观点不同是因为大家认为的“日期时间”不是同一个。

我认为“日期时间”是指按照历法决定的一个时刻的年、月、日、时、分、秒(不考虑相对论,假设只有一个时刻),而“时刻”是一个和历法无关的概念。

例如“太平洋时间 2019 年 3 月 10 日 2 时 31 分 12 秒”是一个不存在的“日期时间”,因为夏令时的调整。

再比如“北京时间 2017 年 1 月 1 日 7 时 59 分 59.5 秒”对应两个“时刻”,因为闰秒。
kera0a
2019-04-01 17:46:52 +08:00
因为时间戳不包含时区信息,所以不存在时区问题😄
aleko
2019-04-01 17:48:36 +08:00
我司用纳秒..js 的精度还不够 !!!
yushiro
2019-04-01 17:52:23 +08:00
@kera0a timestamp 用的就是 UTC+0 时区,请注意 unix timestamp 的定义
rrfeng
2019-04-01 17:54:41 +08:00
@geelaw 你这样一说我才醒悟过来

@Septembers 同学之前提到了 UT 的概念,其实就是『天文历法时间』,根据天文天象计算出来的时间。也就是现在说的 GMT 时间。而 UTC 就是 timestamp 表示的时间,根据一个时间点,以原子钟的标准秒计时计算出来的时间。

而 ISO 8601 跟计时方式或者时间获得方式无关( UT 还是 UTC ),只是一种『表示规范』。
所以正确的用法是:
1. 当前的 UTC 时间是 2019-04-01T09:48Z ( ISO 8601 表示法。)
2. 当前的 GMT 时间是 2019-04-01T09:48Z ( ISO 8601 表示法。)

所以『绝对时间』里,utc=ut,但是要让两者在表示上相同(同时转换为 ISO 8601 ),就会需要做闰秒闰年的调整了。
CruelMoon
2019-04-01 17:55:30 +08:00
@geelaw #24 偶觉得你的说法很有启发性,但偶有个问题:unix 时间戳是从 1970 年 1 月 1 日 0 时 0 分 0 秒起至现在的总秒数。1970 年 1 月 1 日是历法中的概念,那么由此推算出的 unix 时间戳也是和历法有关的概念。
所以要怎么得到一个纯粹的“时刻”呢?
kera0a
2019-04-01 17:59:18 +08:00
@yushiro 😄我知道,我只是调侃一下楼上说的时间戳造成的时区问题。谢谢提醒
geelaw
2019-04-01 18:13:02 +08:00
@CruelMoon #29 UTC 的 1970 年 1 月份 1 日凌晨对应惟一的“时刻”,而“现在”也是一个时刻,所以 Unix 时间戳是用一个时刻(时间戳表示的时刻)和一个固定时刻( 1970-1-1 )的差表示第一个时刻。
rrfeng
2019-04-01 18:19:30 +08:00
@CruelMoon
某个纯粹的时刻是与任何无关的(不考虑高深的物理学上的概念)。
比如『我出生的那一刻』,而 UT (历法时间) 和 UTC (协调时间) 都是用来表述我出生的绝对时刻的一种方式。
而历法时间中的『 1970 年 1 月份 1 日 0 时』是一个绝对时刻,只是我们用 UT 来描述它。
libook
2019-04-01 19:06:56 +08:00
没有万金油,根据需求设计,希望做比较和计算方便就用时间戳,希望做分组方便就记录日期,日期也有带时区不带时区的,要是都需要就冗余一下,全都记录。

对于这种问题,不站队,生产力是最重要的。
passerbytiny
2019-04-01 19:19:15 +08:00
@saulshao 据我所知,oracle 和 mysql 的日期和时间类型都是年月日时分秒类型,而不是时间戳。通常这些类型还会添加额外的辅助字节。
时间戳表示法的原因不是电脑只认整数,电脑只认二进制,整数也是要转换的。用时间戳的原因是这两个:转换逻辑换空间,“懒人技巧”换复杂的对象。
richard1122
2019-04-01 19:56:18 +08:00
@passerbytiny #34 然而 mysql 对于 DATETIME 或者 TIMESTAMP 类型的存储就是时间戳,只是默认展示时进行了格式化(且与链接字符串的时区或 mysql server 配置的时区相关)

参考:

https://dev.mysql.com/doc/refman/8.0/en/datetime.html

"The TIMESTAMP data type is used for values that contain both date and time parts. TIMESTAMP has a range of '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC."

https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html -> Date and Time Type Storage Requirements
zqx
2019-04-01 20:13:00 +08:00
只有整型,是所有数据库都支持的
Buffer2Disk
2019-04-01 20:54:24 +08:00
@richard1122 有一个新问题,既然 TIMESTAMP 是有时间范围限制的,2039 年以后的怎么表示。。。。。
GeekCourse
2019-04-01 21:07:06 +08:00
@Buffer2Disk 换成 long 就可以了
loveCoding
2019-04-01 21:58:02 +08:00
花里胡哨不靠谱,还是 long 简单
sampeng
2019-04-02 00:47:11 +08:00
@rrfeng 多年前被时区支配的恐惧…

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

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

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

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

© 2021 V2EX