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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将MySQL Datetime UTC转换为实际时区相关的知识,希望对你有一定的参考价值。

我有一个数据库,以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 Fiddle http://sqlfiddle.com/#!9/a09700/2

如果在mysql中很难做到这一点,我也可以在php中使用它

答案

除非我遗漏了什么,CONVERT_TZ()正是你所需要的:

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

Demo

唯一的缺点是许多服务器似乎缺乏使用命名时区的适当配置(不确定您是否关注这一点)。

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;
2018-01-05T07:00:00+00:00
2018-01-05T08:00:00+01:00

Demo

附:如果您的GPS跟踪器始终生成相同的数据格式,那么实际上没有理由使用VARCHAR,因为它是MySQL预期的确切日期格式。

另一答案

这些代码在你那正常吗?

选择utc_time作为utc_time,CONVERT_TZ(utc_time,'UTC','CET')作为local_time FROM tab_data;

以上是关于如何将MySQL Datetime UTC转换为实际时区的主要内容,如果未能解决你的问题,请参考以下文章

将存储在mysql(utc格式)中的momentjs datetime格式化为Local DateTime

如何将 UTC DateTimeOffset 转换为使用系统时区的 DateTime

将 UTC DateTime 转换为另一个时区

C# 将 DateTime 从 UTC 转换为 GMT 或 BST

如何仅使用标准库将 UTC 日期时间转换为本地日期时间?

将 Postgres 中没有时区的 DateTime 字段从中欧时间转换为 UTC