数据库存储时的时区问题

先行说一下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也来三三两两独十分酷的问题:

  1. 4许节长度限制,它只有能够及2038年
  2. 重重时候我们期望根据用户所在地的时区显示时间如果非是只有显示一个服务器时间

之所以于好之做法是,数据库被动用DATETIME,然后抱时间之上一律用程序生成UTC时间(而未是local时区的年月)存进,取下的时候不管想展示服务器时间要亮用户之日都可以拍卖。

顺手取一句,根据用户所在地时区显示时间发半点种植做法:

  1. 当用户率先浅造访网站的上,用js获取时区发送到服务器上存到session里
  2. 就此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,它到底意味着的凡光阴为?)。总之见仁见智。

网站地图xml地图