SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 13.07.2007 20:03:26

Golova
Завсегдатай
Зарегистрирован: 23.03.2007
Сообщений: 92

воюем с named time zones :)

Доброго времени суток.
Проблема в том что на сервере храняться нужные даты после функции NOW(), а пользователю должны показываться даты в его часовом поясе(сервер может находится где угодно).
хотел прибегнуть к использованию функции CONVERT_TZ() но столкнулся с трудностями...

Например сервер находится в америке(там -5 к GMT, а сейчас из-за Daylight Saving Time -4),
я нахожусь в Минске(у нас +2 к GMT но опять же из-за Daylight Saving Time у нас сейчас +3):

Хотел обойтись малой кровью и свести преобразование дат к подстановке нужного числа (сколько часов +- к GMT):
Выполняю запросы на американском сервере:

SELECT CONVERT_TZ('2007-07-13 11:37:52','SYSTEM','+02:00');
> 2007-07-13 17:37:52
SELECT CONVERT_TZ('2007-07-13 11:37:52','SYSTEM','Europe/Minsk');
> 2007-07-13 18:37:52

как видно результат с числом не корректен.
Так вот вопрос! как найти названия типа 'Europe/Minsk' в mysql.time_zone_name которые бы соответствовали 24 основным поясам (-12..+12), т.к. этих названий в данной таблице целых 546. Или уважаемые форумчане предложать какой либо другой выход?

P.S. переход на хранение даты в GMT не решает проблемы, хоть и упростил бы наверное работу с датами, но так уж сложилось...

Неактивен

 

#2 13.07.2007 23:47:56

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: воюем с named time zones :)

1. Сервер 5.0 всегда хранит время в UTC.
2. Есть переменная TIME_ZONE, которая характеризует зону клиента.
Попробуйте, например, выполнить SELECT NOW(); SET TIME_ZONE='+10:00'; SELECT NOW();
Все преобразования происходят автоматически.
3. Есть сценарий mysql_tzinfo_to_sql, который преобразует системные именованные
зоны в числа. Если Вы используете windows, то набор стандартных зон можно скачать
с сайта mysql.com из раздела помощи. После выполнения сценария, можно задавать
зону как SET TIME_ZONE='Europe/Minsk';

Неактивен

 

#3 14.07.2007 00:42:58

Golova
Завсегдатай
Зарегистрирован: 23.03.2007
Сообщений: 92

Re: воюем с named time zones :)

paulus написал:

3. Есть сценарий mysql_tzinfo_to_sql, который преобразует системные именованные
зоны в числа. Если Вы используете windows, то набор стандартных зон можно скачать
с сайта mysql.com из раздела помощи.;

смею заметить если вышеприведенных действий не сделать то CONVERT_TZ() попросту будет возвращать NULL.

Наверное вы все таки меня не правильно поняли. Речь идет о поле с датой, например:
time_field datetime NOT NULL DEFAULT '1970-01-01 00:00:00'
пишу я в него следующим образом:
INSERT INTO table SET time_field=NOW();
Напоминаю, что база находится например в америке, т.е. -5 к GMT, а пользователь смотрит через какой либо интерфейс(неважно) на это поле и хочет видеть его как свое локальное время.
например имеем:
time_field='2007-07-13 11:37:52'
пользователь из беларуси должен увидеть:
'2007-07-13 18:37:52'

исходя из этого, нужна формула по которой мы будем высчитывать дату нужную пользователю (ЗАРАНЕЕ ИЗВЕСТНА ВРЕМЕННАЯ ЗОНА В КОТОРОЙ ОН НАХОДИТСЯ).
т.е. запрос будет вида:
SELECT CONVERT_TZ('2007-07-13 11:37:52','SYSTEM','Europe/Minsk');
НО этих названий зон типа 'Europe/Minsk' в mysql.time_zone_name 546 шт.(конечно там есть дубликаты, в смысле одинаковые пояса), но мне нужны только 24.
так мне их вручную выбирать или есть какой то другой способ?

Неактивен

 

#4 14.07.2007 01:07:53

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: воюем с named time zones :)

Зачем придумывать плохое решение, если за Вас сделано уже хорошее?

CONVERT_TZ делать не надо. Сервер в америке устанавливает свою зону,
вставляет NOW(), которое записывается в UTC. Клиент устанавливает
свою зону. И получает данные в своей зоне. Всё происходит автоматически.
От Вас вообще ничего не требуется, чтобы это работало.

Выбрать 24 зоны из 546 можно. Вопрос в том, что делать, если Вы выбрали
не правильно - городов то много. Обычно используют числовые обозначения.

Неактивен

 

#5 16.07.2007 18:52:48

Golova
Завсегдатай
Зарегистрирован: 23.03.2007
Сообщений: 92

Re: воюем с named time zones :)

paulus написал:

Зачем придумывать плохое решение, если за Вас сделано уже хорошее?

CONVERT_TZ делать не надо. Сервер в америке устанавливает свою зону,
вставляет NOW(), которое записывается в UTC. Клиент устанавливает
свою зону. И получает данные в своей зоне. Всё происходит автоматически.

Дело в том что сервер и клиент находят в одной зоне. т.е. запрос передается web серверу, который находится в той же зоне что и MySQL свервер.
А запрос на Web сервер уже может приходить откуда угодно.
Поэтому не понимаю как это может работать за меня - автоматически.

Неактивен

 

#6 17.07.2007 00:23:24

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: воюем с named time zones :)

maxmind.com

Думаю, Вам туда... точнее зону временную можно определить
только спросив ее у пользователя smile

Неактивен

 

#7 17.07.2007 12:38:34

Golova
Завсегдатай
Зарегистрирован: 23.03.2007
Сообщений: 92

Re: воюем с named time zones :)

спасибо, не знал, интересный сервис smile

Неактивен

 

#8 17.07.2007 19:51:27

Golova
Завсегдатай
Зарегистрирован: 23.03.2007
Сообщений: 92

Re: воюем с named time zones :)

короче всё свелось к тому что я перебрал все timezones и нашел для них соответствие в mysql.time_zone_name.
теперь можно конвертировать дату сервера в дату пользователя запросом что то вроде:
SELECT CONVERT_TZ('2007-02-11 2:00:00','SYSTEM','Europe/Moscow');
+--------------------------------------------------------+
| 2007-02-11 10:00:00                                   |
+--------------------------------------------------------+

Отредактированно Golova (17.07.2007 19:53:55)

Неактивен

 

#9 13.07.2008 07:36:56

sakhportal
Участник
Зарегистрирован: 12.07.2008
Сообщений: 3

Re: воюем с named time zones :)

Здравствуйте!
Пожалуйста, объясните мне, как новичку (это не моя основная специальность, а просто хобби...), что конкретно (поэтапно) сделать, чтобы изменить на свой час. пояс?
Я почитал тему.... Выполнил запрос:
SELECT CONVERT_TZ( '2008-07-13 14:28:00', 'SYSTEM', 'Asia/Vladivostok' ) ;
Получил результат:
CONVERT_TZ('2008-07-13 14:28:00','SYSTEM','Asia/Vladivostok') 
NULL
-----------------------------------------------------------------------------------------------

Выполнил:
SELECT NOW(); SET TIME_ZONE='+10:00'; SELECT NOW();
Получил:
SQL-запрос:
SELECT NOW( ) ;# Строки: 1
SET TIME_ZONE = '+10:00';# MySQL вернула пустой результат (т.е. ноль строк).
SELECT NOW( ) ;

NOW() 
2008-07-13 13:41:40


Казалось бы время перешло (без учета летнего)...
Проверял на сайте (создал сообщение на форуме) - сообщения так и создаются по Московскому времени, а не по моему.
На самом сайте я точно проверял время сервера, вернее:
Поставил date_default_timezone_set('Asia/Vladivostok'); 
И для проверки (временно)  ниже ещё одну строчку:
PHP код:
die (date('d.m.Y H:i:s')); 
ПОКАЗАЛО время мое.

о время создания сообщений на форуме, комментариев.... зависит от MySQL.

Очень прошу помочь!

Отредактированно sakhportal (13.07.2008 07:51:17)

Неактивен

 

#10 13.07.2008 23:11:44

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: воюем с named time zones :)

Время, которое показывает PHP не связано с временем, которое отображает MySQL.
Вам следует каждый раз после подключения к MySQL выполнять:
mysql_query("SET TIME_ZONE='+10:00'");

Неактивен

 

#11 14.07.2008 04:56:23

sakhportal
Участник
Зарегистрирован: 12.07.2008
Сообщений: 3

Re: воюем с named time zones :)

Попробовал так сделать, получил:
SQL-запрос:

mysql_query(

"SET TIME_ZONE='+10:00'"
)

Ответ MySQL: 

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'mysql_query("SET TIME_ZONE='+10:00'")' at line 1

--------------------------------------------------------------------------------------------------------------
Версия сервера: 4.1.22
Версия MySQL-клиента: 4.1.18
MySQL-кодировка: UTF-8 Unicode (utf8)
phpMyAdmin - 2.11.1.2

----------------------------------------------------------------------------------------------------------------

Попробовал еще раз. Запрос вроде прошел, только ничего после закрыти окна не показало...

Но я  вот про что. Время создания сообщения или темы или комментариев на сайте зависит от времени не на сервере, а от MySQL. Так мне разработчик движка объяснил. Дак вот не смотря на все эти "манипуляции" в MySQL у меня сообщения все равно создаются по московскому. Мне просто надо сделать так, чтобы сообщения на сайте создавались по моему времени. А это зависит от MySQL.

Отредактированно sakhportal (14.07.2008 05:06:48)

Неактивен

 

#12 14.07.2008 05:14:42

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: воюем с named time zones :)

я имел в виду, что запрос SET TIME_ZONE='+10:00' надо выполнять в PHP каждый раз после подключения

Неактивен

 

#13 14.07.2008 19:59:07

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: воюем с named time zones :)

Сообщения записываются вообще в UTC, а не по-московскому времени. Другое дело, что
сервер по-умолчанию ставит время UTC+4 (или +3 в зимнее время), а Вам нужно +10. Для
этого после подключения нужно установить переменную времени запросом
SET TIME_ZONE='+10:00'. И все даты будут приводиться не к UTC+4, а к UTC+10 - т.е. к
нужному Вам времени.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson