Задавайте вопросы, мы ответим
Вы не зашли.
Доброго времени суток.
Проблема в том что на сервере храняться нужные даты после функции 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 не решает проблемы, хоть и упростил бы наверное работу с датами, но так уж сложилось...
Неактивен
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';
Неактивен
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.
так мне их вручную выбирать или есть какой то другой способ?
Неактивен
Зачем придумывать плохое решение, если за Вас сделано уже хорошее?
CONVERT_TZ делать не надо. Сервер в америке устанавливает свою зону,
вставляет NOW(), которое записывается в UTC. Клиент устанавливает
свою зону. И получает данные в своей зоне. Всё происходит автоматически.
От Вас вообще ничего не требуется, чтобы это работало.
Выбрать 24 зоны из 546 можно. Вопрос в том, что делать, если Вы выбрали
не правильно - городов то много. Обычно используют числовые обозначения.
Неактивен
paulus написал:
Зачем придумывать плохое решение, если за Вас сделано уже хорошее?
CONVERT_TZ делать не надо. Сервер в америке устанавливает свою зону,
вставляет NOW(), которое записывается в UTC. Клиент устанавливает
свою зону. И получает данные в своей зоне. Всё происходит автоматически.
Дело в том что сервер и клиент находят в одной зоне. т.е. запрос передается web серверу, который находится в той же зоне что и MySQL свервер.
А запрос на Web сервер уже может приходить откуда угодно.
Поэтому не понимаю как это может работать за меня - автоматически.
Неактивен
maxmind.com
Думаю, Вам туда... точнее зону временную можно определить
только спросив ее у пользователя
Неактивен
спасибо, не знал, интересный сервис
Неактивен
короче всё свелось к тому что я перебрал все 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)
Неактивен
Здравствуйте!
Пожалуйста, объясните мне, как новичку (это не моя основная специальность, а просто хобби...), что конкретно (поэтапно) сделать, чтобы изменить на свой час. пояс?
Я почитал тему.... Выполнил запрос:
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)
Неактивен
Время, которое показывает PHP не связано с временем, которое отображает MySQL.
Вам следует каждый раз после подключения к MySQL выполнять:
mysql_query("SET TIME_ZONE='+10:00'");
Неактивен
Попробовал так сделать, получил:
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)
Неактивен
я имел в виду, что запрос SET TIME_ZONE='+10:00' надо выполнять в PHP каждый раз после подключения
Неактивен
Сообщения записываются вообще в UTC, а не по-московскому времени. Другое дело, что
сервер по-умолчанию ставит время UTC+4 (или +3 в зимнее время), а Вам нужно +10. Для
этого после подключения нужно установить переменную времени запросом
SET TIME_ZONE='+10:00'. И все даты будут приводиться не к UTC+4, а к UTC+10 - т.е. к
нужному Вам времени.
Неактивен