先说一下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,它到底表示的是时间吗?)。总之见仁见智。

数据库存储时间的时区问题相关推荐

  1. mysql日期可以保存时区_数据库存储时间的时区问题

    先说一下mysql中DATETIME和TIMESTAMP的区别 TIMESTAMP是标准的unix timestamp,它存储的是1970-1-1到现在经过的秒数,4字节存储.mysql用这个类型还蛮 ...

  2. Java连接MySQL数据库时的时区问题

    1.背景 通过Java代码实现向MySQL数据库中存储时间和读取时间, 2.出现的问题 Java代码中的时间点和存到数据库中的时间点不一致,并且验证Linux中的时间点是北京时间. 3.Java代码向 ...

  3. MySql数据库记录相差14小时排错,使用Java访问Mysql数据库时出现时区异常的解决方案

    最近遇到1个大坑,A系统迁移到B系统,2边系统 同1个字段 createTime 看到的不一致. 表象: A系统: 2019-6-10 17:34 B系统: 2019-6-11 .... 再次尝试: ...

  4. 数据库与操作系统时区更改

    ORACLE 11G 新部署的环境,刚使用GOLDENGATE 进行完数据迁移和同步,发现ORACLE 自动收集的任务时间 并不是设定的晚上22点启动.检查AIX 时区发现设置的CDT ,数据库的TI ...

  5. java连接mysql时区修改_java连接mysql数据库时的时区设置问题(time_zone)

    java在连接mysql数据库时,会由于时区设置不正确导致报以下的错误: The server time zone value '???ú±ê×??±??' is unrecognized or re ...

  6. 使用Java访问Mysql数据库时出现时区异常的解决方案

    2019独角兽企业重金招聘Python工程师标准>>> 问题来源:将Mysql5.6版本升级到8.0.12版本后,Java在访问Mysql数据库时出现如下异常: java.sql.S ...

  7. 客户端、服务器、数据库之间的时区转换

    背景 做国外的项目经常会遇到时区转换的问题,这里简单针对遇到的时区问题做个记录,也希望对大家有所帮助,少走弯路.(本文设计开发语言为java) 时区的概念 先说下时区的概念 初中地理好的同学应该还记得 ...

  8. 一、MySQL数据库设置默认时区

    打开CMD将工作目录切换到MySQL的bin下 cd F:\mysql-5.7.21-winx64\binmysql -u root -p输入密码即可登陆MySQLselect now(); 查看my ...

  9. Postgresql 数据库时区(timezone)设置,以及TIMESTAMPTZ和TIMESTAMP数据类型的选择

    timestamp和timestamptz都占用8个字节,在存储时间时并没有本质的区别,都不携带时区信息.只是在insert保存数据和select给数据库客户端返回数据时处理方式不同. 下边以具体示例 ...

最新文章

  1. 面试问了这两个问题,很多人的回答都自相矛盾
  2. Juniper静态路由之no-advertise和qualified-next-hop
  3. C++设计模式--状态模式(state)
  4. 深圳科技园血案:程序员砍杀产品经理
  5. python实现猴子爬山算法
  6. 迷你世界无人驾驶地铁火车_出口伊斯坦布尔地铁列车“云下线”
  7. 什么是事件?JS中都有哪些事件?
  8. HDU3786 找出直系亲属【关系闭包】
  9. 少样本学习系列(四)【元学习与少样本深层理解】
  10. 一些Arduino 测试代码
  11. php mysql cpu使用率_Mysql CPU占用高的问题解决方法小结
  12. Spring之AOP理解
  13. 树莓派计算机组装,Samytronix Pi:用树莓派 DIY 的桌面计算机
  14. 肌酸报告:17个肌酸使用常见问题解答
  15. 如何定位web前后台的BUG
  16. Python是如何将“中文”转“拼音”的?
  17. 【深度域适配】二、利用DANN实现MNIST和MNIST-M数据集迁移训练
  18. Android用usb命令控制音量,如何在Android平台上使用USB Audio设备
  19. 35美元最小电脑树莓派windows10初体验 raspberry pi 2 win10
  20. 走路步数怎么在屏幕上显示_华为走步步数不在屏幕上显示如何设置

热门文章

  1. 【转】其实Unix很简单
  2. Kettle环境搭建及使用(数据迁移)
  3. Photoshop CC 2019多边形形的抠图
  4. 软件测试--接口流程化测试
  5. 接口测试之post常见数据提交方式
  6. Spring @RequestMapping注解示例
  7. 前端开发基础知识整理--web综合篇
  8. PTA的非零返回原因以及解决办法
  9. c mvc html 选中删除,在 MVC htmlAttribute中,如何设置被禁用_CSharp_开发99编程知识库...
  10. 360安全卫士电脑版_卸载360安全卫士!保护你的电脑安全