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