资讯专栏INFORMATION COLUMN

数据库存储时间的时区问题

ispring / 1816人阅读

摘要:用这个类型还蛮方便的,一个是有很多内置的函数和来处理它,比如宏,最关键的是在取数据的时候会自动帮你处理和时区的问题。至于用存时间,是另一种可行的方法,参见我个人不是很喜欢这么做,因为这样你必须把模型中表示时间的成员声明为类型。

先说一下mysql中DATETIME和TIMESTAMP的区别

TIMESTAMP是标准的unix timestamp,它存储的是1970-1-1到现在经过的秒数,4字节存储。mysql用这个类型还蛮方便的,一个是有很多内置的函数和trigger来处理它,比如CURRENT_TIMESTAMP宏,最关键的是在取数据的时候mysql会自动帮你处理DST和时区的问题。

DATETIME的范围更大,好像可以从0000-00-00 00:00:00到9999-12-31 23:59:59,8字节存储,当然mysql内部肯定也是用整数而不是字符串的(说了是8字节了),所以效率不是大问题。但DATETIME不带时区,比如我在程序里生成了一个2015-05-07 15:26:00的时间(实际上是+8时区的,但这个对象可能是timezone naive)的,存到mysql里,再从不同时区的地方拿出来,这个时间可能就混了。

但TIMESTAMP也有两个很大的问题:

4字节长度限制,它只能到2038年

很多时候我们希望根据用户所在地的时区显示时间而不是光显示一个服务器时间

所以比较好的做法是,数据库中使用DATETIME,然后存时间的时候一律用程序生成UTC时间(而不是local时区的时间)存进去,取出来的时候不管想显示服务器时间还是显示用户的时间都可以处理。

顺便提一句,根据用户所在地时区显示时间有两种做法:

当用户第一次访问网站的时候,用js获取时区发送到服务器上存到session里

用js处理时间的显示(我觉得这种比较方便一点,毕竟不用改服务端代码)

使用这种做法的唯一缺点是sqlite3没有internal的DATETIME类型,所以在ORM框架如sqlalchemy中,它会直接存字符串进去。(sqlite3的文档也说,你要么存成int要么real要么字符串)。尽管这可能带来一些不方便和性能的下降,但我认为还是符合“keep it simple and stupid”的原则。

至于用INT存时间,是另一种可行的方法,参见http://www.liaoxuefeng.com/article/0014132675721847f569c3514034f099477...
我个人不是很喜欢这么做,因为这样你必须把模型中表示时间的成员声明为int类型。这样是比较不符合逻辑的(那些Date呀Datetime之类的类就没有用了呀,最多就有个Dateutil就好了),而且会使得程序不易读(卧槽这个publishedDate为什么是int,它到底表示的是时间吗?)。总之见仁见智。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/17463.html

相关文章

  • 日期居然用字符串保存?我笑了

    摘要:微信公众号后端进阶,专注后端技术分享框架分布式中间件服务治理等等。 微信公众号「后端进阶」,专注后端技术分享:Java、Golang、WEB框架、分布式中间件、服务治理等等。 老司机倾囊相授,带你一路进阶,来不及解释了快上车! 我发现数据库有些日期居然用字符串保存?于是跟几个小伙伴讨论了关于数据库的日期应该要怎么保存的问题,其实我一直都建议直接用数值保存时间戳,为什么我要这么建议呢?...

    Leck1e 评论0 收藏0
  • 国际版多时区设计方案

    摘要:用户场景国际版中各个仓库分属不同的城市,不同的城市所在时区不同,基于各个角色对数据的使用情况不一样主要的用户场景库内作业人员,仓库是纽约仓,时区是,查询到的仓库入库单。在查询结果显示的时候,时间数据也需要转换到纽约时区。 用户场景 国际版中各个仓库分属不同的城市,不同的城市所在时区不同,基于各个角色对数据的使用情况不一样主要的用户场景库内作业人员,仓库是纽约仓,时区是UTC-05:00...

    史占广 评论0 收藏0
  • 国际版多时区设计方案

    摘要:用户场景国际版中各个仓库分属不同的城市,不同的城市所在时区不同,基于各个角色对数据的使用情况不一样主要的用户场景库内作业人员,仓库是纽约仓,时区是,查询到的仓库入库单。在查询结果显示的时候,时间数据也需要转换到纽约时区。 用户场景 国际版中各个仓库分属不同的城市,不同的城市所在时区不同,基于各个角色对数据的使用情况不一样主要的用户场景库内作业人员,仓库是纽约仓,时区是UTC-05:00...

    frank_fun 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<