Eljko-Ivkovi给出的答案是,“欧洲/伦敦”这样的时区描述符只在MySQL管理员将时区表添加到系统中并保持更新时才起作用。
否则,您只能使用数字偏移,如“-4:00”。幸运的是,php日期(“p”)格式提供了它(从5.1.3开始)
所以在应用程序配置文件中
define('TZ', 'US/Pacific');
....
if (defined('TZ') && function_exists('date_default_timezone_set')) {
date_default_timezone_set(TZ);
$mdb2->exec("SET SESSION time_zone = " . $mdb2->quote(date('P')));
}
这意味着PHP和MySQL将在使用什么时区偏移量上达成一致。
始终使用时间戳存储时间值
. 该列实际上存储为Unix时间(epoch),但在写入时从当前时区偏移量隐式转换,在读取时返回。
如果要为其他时区的用户显示时间,则不要使用global define(),而是在上面设置其给定时区。当你的应用程序看到结果集时,MySQL会自动转换时间戳值(有时这可能是个问题,如果你真的需要知道事件的原始时区,那么它也需要在另一列中)
至于“为什么不将所有时间都存储为int”,这确实会使您失去比较和验证日期的能力,意味着您
总是
必须在应用程序级别转换为日期表示(当您直接查看数据时很难看到-快速,在1254369600发生了什么?)