先说一下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处理时间的显示(我觉得这种比较方便一点,毕竟不用改服务端代码)

Java获取当前UTC时间戳(毫秒)

public static String getUTCTimeStr() throws Exception {

Calendar cal = Calendar.getInstance();

return String.valueOf(cal.getTimeInMillis() / 1000);// 返回的就是UTC时间

}

使用这种做法的唯一缺点是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,它到底表示的是时间吗?)。总之见仁见智。

mysql日期可以保存时区_数据库存储时间的时区问题相关推荐

  1. mysql基础小测试三_数据库---MySQL(三)

    一.视图 视图是一个虚拟表,是sql的查询结果,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据,在使用视图时动态生成.视图的数据变化会影响到基表,基表的数据变化也会影响到视图[i ...

  2. db2数据库日期减一天_数据库date减一天

    Oracle时间运算 目录 =========================================1.Oracle的日期函数2.日期加减3.月份加减4.年份加减5.求每月的最后一天6.求每 ...

  3. mysql 日期索引的使用_日期使用

    mysql 日期索引的使用 时区糟透了. 特别是夏令时. 我不介意像与此行为相关的编程错误那样,不停移动时钟或失去一个小时的睡眠. 更糟糕的是Java的旧日期/时间API. Java社区通过JSR 3 ...

  4. mysql 日期减10分钟_获取当前时间减去10分钟的话SQL语句怎么写

    获取当前时间减去10分钟的话SQL语句怎么写 Mysql日期和时间函数不求人 本文出自:http://linuxdb.yeah.net 作者: 晏子 (2001-07-05 15:00:00) 对于每 ...

  5. MySQL按名字查询所有信息_数据库小记:根据指定名称查询数据库表名及根据指定名称查询数据库所有表中的字段名称(支持mysql/postgre)...

    注意:本篇文章仅适用于mysql和postgre这两种数据库 1.查询数据库中所有表名及对应表的详细信息 select * from INFORMATION_SCHEMA.tables 2.根据指定名 ...

  6. mysql表之间怎么联动_数据库之间的数据联动调整方法、装置及系统的制作方法...

    数据库之间的数据联动调整方法.装置及系统的制作方法 [技术领域] [0001]本发明涉及一种信息处理技术领域,特别是涉及一种数据库之间的数据联动调整方法.装置及系统. [背景技术] [0002]随着信 ...

  7. java calendar 设置时区_详解Java时区处理之Date,Calendar,TimeZone,SimpleDateFormat

    一.概述 1.问题描述 使用Java处理时间时,我们可能会经常发现时间不对,比如相差8个小时等等,其真实原因便是TimeZone.只有正确合理的运用TimeZone,才能保证系统时间无论何时都是准确的 ...

  8. java虚拟机时区_转:jvm设置时区问题

    转自:http://hi.baidu.com/iammonster/blog/item/d4b386de053c0f5ecdbf1a1b.html 今天遇到一个问题,就是本机数据传到另外一台机器后时间 ...

  9. mysql以下日期函数正确的_[数据库]MYSQL基础03(日期函数)

    [数据库]MYSQL基础03(日期函数) 0 2015-10-29 01:00:09 工作中对日期的处理是经常遇到的,需求可能多种多样,因此重点介绍. 1.获取当前日期select NOW()-- 结 ...

最新文章

  1. iOS开发之--TableViewCell重用机制避免重复显示问题
  2. Add margining capability to a dc/dc converter
  3. 【转】C 编译器优化过程中的 Bug
  4. 面试题整理10 最小的k个数
  5. java数组二分查找的简单例题_Java基础-练习 数组元素二分查找(折半查找)
  6. [深度学习] 自然语言处理 --- 1.Attention
  7. mysql主从1594错误_3分钟解决MySQL主从1594错误
  8. 如何成为一个成功的 Java 开发人员?
  9. 2018年5大微服务发展趋势
  10. C++全局函数与成员函数的区别
  11. gtest基础使用01:编写第一条单元测试用例
  12. Behavior(行为)
  13. STM32控制TFTLCD显示屏(理论)
  14. iOS 中的常用设计模式总结
  15. C#生成格林威治时间字符串
  16. 5G室内定位来了,化工厂人员定位,电厂室内定位都有用它!-新导智能
  17. inet aton在java_地址转换函数:inet_aton inet_ntoa inet_addr和inet_pton inet_ntop
  18. 从最简单的ROE和PB的角度去选股
  19. android 实用干货 - 收藏集 - 掘金
  20. ajax提交时页面转圈,jquery的ajax提交时loading提示的处理方法

热门文章

  1. 刚装了fedora 17,装机必备,解决视频格式和中文输入法。
  2. 《那些年啊,那些事——一个程序员的奋斗史》——115
  3. avi和音频合成 ffmpeg_使用Java和ffmpeg把音频和视频合成视频的操作方法
  4. 拦截器、过滤器、@Aspect 区别
  5. Error inflating class xxx.view
  6. java setDataSource 报红
  7. 手机内存卡转化linux,Android 往手机内存卡上存储用户名与密码的操作
  8. 权限分配之权限的展示
  9. 001. Ansible简介
  10. 自制操作系统Antz -- 系列文章