Mysql:将DB从本地时间转换为UTC

Joe*_*nsn 13 mysql timezone utc unix-timestamp

我需要从本地时间ut UTC转换现有(日期时间字段)数据库.

这些值将广告日期时间存储在服务器上,时区为CET(+1)(夏令时+2).选择我使用的数据时UNIX_TIMESTAMP(),它会神奇地补偿所有内容,即时区转移和dst(如果我已经正确阅读了文档).

我正在将数据库移动到以UTC为系统时间的新服务器.

简单地减去-1 H将不起作用,因为夏季时间为+2.

有什么想法聪明地做到这一点?(使用sql或一些脚本lang)

Ike*_*ker 27

首先,您需要确保填充mysql.time_zone_name表.如果它是空的,您可以按照此页面上的说明填充它:

http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html

它通常就像在shell中运行这样的命令一样简单:

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
Run Code Online (Sandbox Code Playgroud)

填充该表后,您可以使用CONVERT_TZ()函数更新DB中的现有值:

http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_convert-tz

以下是两个示例,说明它如何在冬季和夏季将日期时间从CET转换为UTC:

mysql> SELECT CONVERT_TZ('2010-01-22 12:00:00','CET','UTC');
+-----------------------------------------------+
| CONVERT_TZ('2010-01-22 12:00:00','CET','UTC') |
+-----------------------------------------------+
| 2010-01-22 11:00:00                           |
+-----------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT CONVERT_TZ('2010-07-22 12:00:00','CET','UTC');
+-----------------------------------------------+
| CONVERT_TZ('2010-07-22 12:00:00','CET','UTC') |
+-----------------------------------------------+
| 2010-07-22 10:00:00                           |
+-----------------------------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

  • @kalvish,你可能只需要填充mysql.time_zone_name表.尝试在shell中运行此命令来填充该表:`mysql_tzinfo_to_sql/usr/share/zoneinfo | mysql -u root mysql` (3认同)

Sve*_*ven 6

应该注意的是,日期从一个时区到另一个时区或UTC的转换只能在日期过去时可靠地完成.

时区定义发生变化.它们是如何偏离"太阳时钟"的人类定义,这些定义可以并且确实不断变化.因此,唯一有效的转换是针对过去的日期,因为这不会再发生变化.

将来的任何日期都无法可靠地转换,因为转换只能考虑当前已知的时区定义.

简单的例子:让我们明年在德国柏林创建一个会议预约.我们今天同意我们想在2014年7月1日12:00在亚历山大广场见面.该日期将被转换为当天10:00 UTC.

现在,如果某个政府决定在2014年选择退出夏令时,那么您在决定是否应该在当地时间12:00或当地时间11:00出现时会遇到问题,因为从UTC转换回来会产生在不同的当地时间.

如果您保存了"2014-07-01 12:00 Europe/Berlin"的原始日期,那么您将在中午的确切时间与其他人一样.