› 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 · 8013 views
    This topic created in 4084 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  
       Jul 31, 2015
    存时间戳。
    只要操作MYSQL的程序(假设你是PHP)的本机时区时间设置正确,用time()生成的时间戳直接保存就行了
    使用端只要本机的时区和时间戳设置正确,直接date("Y-m-d H:i:s",$timestamp)出来的就是本地时间
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2521 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 15:03 · PVG 23:03 · LAX 08:03 · JFK 11:03
    ♥ Do have faith in what you're doing.