如何将 MySQL 日期时间 UMT 转换为实际时区
How to convert MySQL Datetime UMT to actual Timezone
我有一个数据库,它以 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,但据我所知,我只能将其从一个时区转换为另一个时区,而不能从两个不同的时区转换。
这里是SQLFiddle
http://sqlfiddle.com/#!9/a09700/2
如果这在 MySQL 中很难做到,我也可以在 PHP
中做到
这个代码对你有用吗?
SELECT utc_time
as utc_time, CONVERT_TZ( utc_time
,'UTC','CET') as local_time FROM
tab_data
;
除非我遗漏了什么,CONVERT_TZ()正是您所需要的:
SELECT CONVERT_TZ('2018-01-05 07:00:00', 'UTC', 'Europe/Warsaw');
2018-01-05 08:00:00
唯一的缺点是许多服务器似乎缺少使用命名时区的适当配置(不确定您是否担心)。
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
P.S。如果您的 GPS 跟踪器始终生成相同的数据格式,那么实际上没有理由使用 VARCHAR
,因为它正是 MySQL.
期望的确切日期格式
我有一个数据库,它以 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,但据我所知,我只能将其从一个时区转换为另一个时区,而不能从两个不同的时区转换。
这里是SQLFiddle http://sqlfiddle.com/#!9/a09700/2
如果这在 MySQL 中很难做到,我也可以在 PHP
中做到这个代码对你有用吗?
SELECT
utc_time
as utc_time, CONVERT_TZ(utc_time
,'UTC','CET') as local_time FROMtab_data
;
除非我遗漏了什么,CONVERT_TZ()正是您所需要的:
SELECT CONVERT_TZ('2018-01-05 07:00:00', 'UTC', 'Europe/Warsaw');
2018-01-05 08:00:00
唯一的缺点是许多服务器似乎缺少使用命名时区的适当配置(不确定您是否担心)。
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
P.S。如果您的 GPS 跟踪器始终生成相同的数据格式,那么实际上没有理由使用 VARCHAR
,因为它正是 MySQL.