我需要从本地时间UTC UTC转换现有(日期时间字段)数据库。
这些值将广告日期时间存储在服务器上,时区为CET(+1)(夏令时+2)。在选择数据时,我使用UNIX_TIMESTAMP()
,它可以神奇地补偿所有内容,即时区转移和dst(如果我已经正确阅读了文档)。
我正在将数据库移动到以UTC为系统时间的新服务器。
简单地减去-1 H将无效,因为夏令时为+2。
有什么想法可以聪明地做到这一点吗? (使用sql或一些脚本lang)
答案 0 :(得分:26)
首先,您需要确保填充了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
填充该表后,您可以使用CONVERT_TZ()函数更新数据库中的现有值:
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)
答案 1 :(得分:6)
应该注意的是,日期从一个时区到另一个时区或UTC的转换只能在日期过去时可靠地完成。
时区定义发生变化。它们是如何偏离“太阳时钟”的人类定义,这些定义可以并且确实不断变化。所以唯一有效的转换是针对过去的日期,因为这不会再改变了。
未来的任何日期都无法可靠地转换,因为转换只能考虑当前已知的时区定义。
简单的例子:让我们明年在德国柏林创建一个会议预约。我们今天同意我们想在2014年7月1日12:00在亚历山大广场见面。该日期将被转换为当天10:00 UTC。
现在如果某个政府决定在2014年选择退出夏令时,那么您在决定是否应该在当地时间12点或当地时间11点出现时会遇到问题,因为转换回来自UTC将产生不同的当地时间。
如果您保存了“2014-07-01 12:00欧洲/柏林”的原始日期,那么您将在中午的确切时间到达那里,就像其他人一样。
答案 2 :(得分:4)
在原始服务器中,您可以在UPDATE查询中使用以下表达式之一:
CONVERT_TZ(your_datetime_field,'SYSTEM','UTC')
CONVERT_TZ(your_datetime_field,@@global.time_zone,'UTC')
或者,在目标服务器中,如果您知道原始服务器的时区(例如“Europe / Berlin”),则可以使用以下表达式之一:
CONVERT_TZ(your_datetime_field,'Europe/Berlin','UTC')
CONVERT_TZ(your_datetime_field,'Europe/Berlin',@@global.time_zone)