如何将MySQL Datetime UMT转换为实际时区

如何将MySQL Datetime UMT转换为实际时区,mysql,datetime,timezone-offset,Mysql,Datetime,Timezone Offset,我有一个数据库,它以UTC格式存储来自GPS跟踪器的日期时间。 例如: CREATE TABLE IF NOT EXISTS `tab_data` ( `id` int(6) unsigned NOT NULL, `utc_time` varchar(200) NOT NULL, PRIMARY KEY (`id`) ) DEFAULT CHARSET=utf8; INSERT INTO `tab_data` (`id`, `utc_time`) VALUES ('1', '20

我有一个数据库,它以UTC格式存储来自GPS跟踪器的日期时间。 例如:

CREATE TABLE IF NOT EXISTS `tab_data` (
  `id` int(6) unsigned NOT NULL,
  `utc_time` varchar(200) NOT NULL,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `tab_data` (`id`, `utc_time`) VALUES
  ('1', '2018-01-05 07:00:00'), //this should be in UTC +1
  ('2', '2018-02-04 01:10:00'), //this should be in UTC +1
  ('3', '2018-07-01 15:00:00'), //this should be in UTC +2
  ('4', '2018-08-22 16:00:00'); //this should be in UTC +2
我想做的是在波兰合适的时间从数据库中获取这些数据。 与欧洲许多国家一样,波兰也有夏季和冬季: -冬季是CET时区(UTC+1) -夏季是CEST时区(UTC+2)

如何将此DateTime从数据库转换为适当的时间(+1或+2h)

通常我会使用此查询,但此时间必须转换为一年中适当时间适用的时区

SELECT `utc_time` AS time FROM `tab_data`;

我知道这是CONVERT_TZ选项,但据我所知,我只能将其从一个时区转换为另一个时区,而不能从两个不同的时区转换

这是SQL小提琴


如果在MySQL中很难做到这一点,我也可以在PHP中实现这一点。这段代码对您有用吗

选择
utc\u时间
作为utc\u时间,将时间(
utc\u时间
,'utc','CET')转换为本地时间
tab_数据


除非我遗漏了什么,这正是你需要的:

SELECT CONVERT_TZ('2018-01-05 07:00:00', 'UTC', 'Europe/Warsaw');

唯一的缺点是,许多服务器似乎缺少使用命名时区的适当配置(不确定您是否担心这一点)

PHP替代方案应该是开箱即用的:

$utc = new DateTimeZone('UTC');
$local = new DateTimeZone('Europe/Warsaw');
$dt = new DateTime('2018-01-05 07:00:00', $utc);
echo $dt->format('c'), PHP_EOL;
$dt->setTimezone($local);
echo $dt->format('c'), PHP_EOL;


如果您的GPS跟踪器始终生成相同的数据格式,实际上没有理由使用<代码> VARCHAR> <代码>,因为它是MySQL期望的确切日期格式。

您是否考虑将其作为UNIX时间戳存储在数据库中,这样您可以使用MySQL日期/时间函数来转换时区吗?Ivan M:数据库已经存在,数据以其格式直接从GPS设备发送。“我知道这是转换选项,但据我所知,我只能从一个时区转换到另一个时区,而不能从两个不同的时区转换。”为什么需要从两个不同的时区转换?我在这里遗漏了一些东西?。。。。至少您需要存储数据所属的国家/地区和utc偏移量。这样,它就不应该受到夏季或冬季时间的影响,因为utc是utc。没有夏季/冬季变化,因为格伦维奇从不移动其纵向数据。您为什么不使用CONVERT_TZ并始终将其从utc转换到您想要的任何时区?谢谢这对我有用。问题是我在Synology的本地数据库没有内置时区表。在我将时区添加到mysql之后,它就可以正常工作了。顺便说一句:我没有使用varchar来存储日期,这只是在讨论中使用的。
$utc = new DateTimeZone('UTC');
$local = new DateTimeZone('Europe/Warsaw');
$dt = new DateTime('2018-01-05 07:00:00', $utc);
echo $dt->format('c'), PHP_EOL;
$dt->setTimezone($local);
echo $dt->format('c'), PHP_EOL;
2018-01-05T07:00:00+00:00
2018-01-05T08:00:00+01:00