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

2015-07-27 08:27:40 +08:00
 ShinichiYao

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

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

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

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

比如同一用户出差到不同时区这样的情况.
realpg
2015-07-31 10:06:00 +08:00
存时间戳。
只要操作MYSQL的程序(假设你是PHP)的本机时区时间设置正确,用time()生成的时间戳直接保存就行了
使用端只要本机的时区和时间戳设置正确,直接date("Y-m-d H:i:s",$timestamp)出来的就是本地时间

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/208541

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX