MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
ShinichiYao
V2EX  ›  MySQL

涉及多个时区业务的数据库时间存取问题

  •  
  •   ShinichiYao · Jul 27, 2015 · 7424 views
    This topic created in 3946 days ago, the information mentioned may be changed or developed.

    保存的时间是不是统一用UTC时间比较好?还是每个地区用各自的当地时间来保存?时间不仅仅是用来显示,还涉及一些逻辑运算,比如按日期取出某一天的所有数据进行计算,但是需要根据不同时区来取某一天,有没有什么方法不造成混乱?

    18 replies    2015-07-31 10:06:00 +08:00
    lichao
        1
    lichao  
       Jul 27, 2015
    数据库中保存 UTC,每个用户账号中保存一个“所在时区”字段,显示或逻辑运算的时候转换一下
    lichao
        2
    lichao  
       Jul 27, 2015
    @lichao 显示时间的时候也把时区显示出来,例如 2015-07-27 08:35:11 +0800
    ShinichiYao
        3
    ShinichiYao  
    OP
       Jul 27, 2015
    @lichao 谢谢,那如果我要按+0800的时区取出2015-07-07那一天的数据要怎么做呢?
    ShinichiYao
        4
    ShinichiYao  
    OP
       Jul 27, 2015
    有些国家比如意大利还有夏令时,一想到怎么取时间就头疼啊
    lichao
        5
    lichao  
       Jul 27, 2015
    @ShinichiYao 把 2015-07-07 转换为 UTC,然后数据库中 where 呗
    dndx
        6
    dndx  
       Jul 27, 2015 via iPhone
    @ShinichiYao UTC 就没夏令时。
    ShinichiYao
        7
    ShinichiYao  
    OP
       Jul 27, 2015
    @lichao 不好意思,还是不太能理解,数据库保存的是UTC,那么实际我需要取出的是 2015-07-07 08:00:00 之后的数据和 2015-07-08 08:00:00 之前的数据,并且是按照本地时间显示出来也就是2015-07-07 00:00:00 到 2015-07-07 23:59:59,MySQL有这样按时区转换后时间条件的判断语句吗?
    msg7086
        8
    msg7086  
       Jul 27, 2015
    为啥要时区转换后?

    你从用户这里读到了07-07 8:00+8,代码里转成07-07 0:00Z扔进数据库里查不就行了?
    ShinichiYao
        9
    ShinichiYao  
    OP
       Jul 27, 2015
    @msg7086 我从用户这里读到的是07-07,我要根据用户的时区去数据库找到对应时区07-07 0点到24点的所有数据,还要判断对方当前这个日期是否是夏令时再进行+1小时判断
    zhicheng
        10
    zhicheng  
       Jul 27, 2015 via Android
    模版里转换一下就行了。这个肯定是存UTC的。
    siteshen
        11
    siteshen  
       Jul 27, 2015 via iPhone
    r t
    yutian2211
        12
    yutian2211  
       Jul 27, 2015
    实际时间是UTC,展示时间是+tz的,
    如果要查在某一个时区的结果,把这个时区的时间换算成UTC,到数据库中Where就好了
    ShinichiYao
        13
    ShinichiYao  
    OP
       Jul 27, 2015
    暂时还是用全局UTC,查询CONVERT_TZ( '2015-07-07 12:00', '+00:00', '+08:00' )来做吧
    至于夏令时,就用PHP判定一下
    $timezone = date('e'); //获取当前使用的时区
    date_default_timezone_set('Europe/Rome'); //强制设置时区
    $dst = date('I'); //判断是否夏令时
    date_default_timezone_set($timezone); //还原时区
    Khlieb
        14
    Khlieb  
       Jul 27, 2015 via Android
    @ShinichiYao 设计一种规则,按具体时区转换夏令时
    finab
        15
    finab  
       Jul 27, 2015
    如果每个地区的数据相关,例如 获取两个时区某一天的数据 就存UTC和时区吧

    如果两个时区数据比较独立,不会存在 这个时区和那个时区的数据同时取,就存每个时区的时间呗。。
    lazing
        16
    lazing  
       Jul 27, 2015
    要看数据库和应用框架。比如 postgres 就有 datetime_with_timezone 的类型
    zodiac1111
        17
    zodiac1111  
       Jul 27, 2015
    统一utc.显示是根据local确定.

    比如同一用户出差到不同时区这样的情况.
    realpg
        18
    realpg  
    PRO
       Jul 31, 2015
    存时间戳。
    只要操作MYSQL的程序(假设你是PHP)的本机时区时间设置正确,用time()生成的时间戳直接保存就行了
    使用端只要本机的时区和时间戳设置正确,直接date("Y-m-d H:i:s",$timestamp)出来的就是本地时间
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2831 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 60ms · UTC 12:04 · PVG 20:04 · LAX 05:04 · JFK 08:04
    ♥ Do have faith in what you're doing.