V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
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 · 2015-07-27 08:27:40 +08:00 · 6498 次点击
    这是一个创建于 3437 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    18 条回复    2015-07-31 10:06:00 +08:00
    lichao
        1
    lichao  
       2015-07-27 08:33:09 +08:00
    数据库中保存 UTC,每个用户账号中保存一个“所在时区”字段,显示或逻辑运算的时候转换一下
    lichao
        2
    lichao  
       2015-07-27 08:35:18 +08:00
    @lichao 显示时间的时候也把时区显示出来,例如 2015-07-27 08:35:11 +0800
    ShinichiYao
        3
    ShinichiYao  
    OP
       2015-07-27 08:47:09 +08:00
    @lichao 谢谢,那如果我要按+0800的时区取出2015-07-07那一天的数据要怎么做呢?
    ShinichiYao
        4
    ShinichiYao  
    OP
       2015-07-27 08:50:01 +08:00
    有些国家比如意大利还有夏令时,一想到怎么取时间就头疼啊
    lichao
        5
    lichao  
       2015-07-27 08:55:25 +08:00
    @ShinichiYao 把 2015-07-07 转换为 UTC,然后数据库中 where 呗
    dndx
        6
    dndx  
       2015-07-27 09:05:11 +08:00 via iPhone
    @ShinichiYao UTC 就没夏令时。
    ShinichiYao
        7
    ShinichiYao  
    OP
       2015-07-27 09:06:34 +08:00
    @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  
       2015-07-27 09:09:42 +08:00
    为啥要时区转换后?

    你从用户这里读到了07-07 8:00+8,代码里转成07-07 0:00Z扔进数据库里查不就行了?
    ShinichiYao
        9
    ShinichiYao  
    OP
       2015-07-27 09:19:53 +08:00
    @msg7086 我从用户这里读到的是07-07,我要根据用户的时区去数据库找到对应时区07-07 0点到24点的所有数据,还要判断对方当前这个日期是否是夏令时再进行+1小时判断
    zhicheng
        10
    zhicheng  
       2015-07-27 09:27:24 +08:00 via Android
    模版里转换一下就行了。这个肯定是存UTC的。
    siteshen
        11
    siteshen  
       2015-07-27 09:28:25 +08:00 via iPhone
    r t
    yutian2211
        12
    yutian2211  
       2015-07-27 09:39:22 +08:00
    实际时间是UTC,展示时间是+tz的,
    如果要查在某一个时区的结果,把这个时区的时间换算成UTC,到数据库中Where就好了
    ShinichiYao
        13
    ShinichiYao  
    OP
       2015-07-27 09:49:01 +08:00
    暂时还是用全局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  
       2015-07-27 10:20:09 +08:00 via Android
    @ShinichiYao 设计一种规则,按具体时区转换夏令时
    finab
        15
    finab  
       2015-07-27 10:23:00 +08:00
    如果每个地区的数据相关,例如 获取两个时区某一天的数据 就存UTC和时区吧

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

    比如同一用户出差到不同时区这样的情况.
    realpg
        18
    realpg  
       2015-07-31 10:06:00 +08:00
    存时间戳。
    只要操作MYSQL的程序(假设你是PHP)的本机时区时间设置正确,用time()生成的时间戳直接保存就行了
    使用端只要本机的时区和时间戳设置正确,直接date("Y-m-d H:i:s",$timestamp)出来的就是本地时间
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2447 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 15:52 · PVG 23:52 · LAX 07:52 · JFK 10:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.