Как преобразовать MySQL Datetime UMT в фактический часовой пояс - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть база данных, которая хранит дату и время с GPS трекеров в формате UTC.Например, что-то вроде:

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 или + 2 часа)

Обычно я буду использовать этот запрос, но это время должно быть преобразовано в часовой пояс, применимый в соответствующее время года

SELECT `utc_time` AS time FROM `tab_data`;

Я знаю, что это опция CONVERT_TZ, но, насколько я знаю, я могу конвертировать ее только из одного часового пояса в другой, а не из двух разных часовых поясов.

Вот SQL Fiddle http://sqlfiddle.com/#!9/a09700/2

Если это трудно сделать в MySQL, я мог бы также сделать это в PHP

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Если я что-то упустил, 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

Демо

PS Если ваши GPS-трекеры постоянно генерируют один и тот же формат данных, на самом деле нет смысла использовать VARCHAR, поскольку это точная датаформат, ожидаемый MySQL.

0 голосов
/ 03 декабря 2018

Этот код работает для вас?

SELECT utc_time как utc_time, CONVERT_TZ (utc_time, 'UTC', 'CET') как local_time FROM tab_data;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...