处理时区
当你需要在 MySQL 中处理全球用户群的时间信息时,请在表中使用 TIMESTAMP 数据类型。
对于每个用户,存储用户首选项时区列。VARCHAR(64)
是该列的良好数据类型。当用户注册使用你的系统时,请询问时区值。我的是大西洋时间,America/Edmonton
。你的可能是也可能不是 Asia/Kolkata
或 Australia/NSW
。对于此用户首选项设置的用户界面,WordPress.org 软件就是一个很好的例子。
最后,无论何时代表用户建立从主机程序(Java,php 等)到 DBMS 的连接,都要发出 SQL 命令
SET SESSION time_zone='(whatever tz string the user gave you)'
在处理涉及时间的任何用户数据之前。然后,你安装的所有 TIMESTAMP
次将在用户的本地时间呈现。
这将导致进入表的所有时间都转换为 UTC,并且所有时间都将转换为本地。它适用于 NOW()
和 CURDATE()。同样,你必须使用 TIMESTAMP 而不是 DATETIME 或 DATE 数据类型。
确保你的服务器操作系统和默认 MySQL 时区设置为 UTC。如果在开始将信息加载到数据库之前不这样做,则几乎不可能修复。如果你使用供应商运行 MySQL,坚持他们做对了。