[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проблема с now()
maximka787
Парни помогите. Срочное дело. У меня при переносе проекта на новый хостинг стала неправильно работать функция select now(). Она показывает время на 3 часа раньше фактического. Я долго гуглил и пока не понял, где лучше прописать настройку времени. Php дает верную дату. Хостинг массовый, права к конфигам ограничены.
Как быть в моей ситуации?
У меня много вызовов now(). И хотелось бы, чтобы дата была верная.
Поля в БД datetime. Время нужно чтоб сохранялось только по Москве.

_____________
..Работает - не трогай!
AllesKlar
Настройки сервера базы данных.
копай в сторону SET TIME ZONE при каждом подключении к базе.

_____________
[продано копирайтерам]
killer8080
Цитата (maximka787 @ 11.08.2015 - 23:51)
У меня много вызовов now(). И хотелось бы, чтобы дата была верная.
Поля в БД datetime. Время нужно чтоб сохранялось только по Москве.

а как быть с юзерами из других часовых поясов?

PS поэтому нужно по возможности всегда использовать timestamp, а не datetime.
maximka787
Юзеры будут только из москвы и мо. Нужно просто добавлять время создания сообщений.

Попробую делать set при каждом подключении.

_____________
..Работает - не трогай!
maximka787
Цитата (killer8080 @ 12.08.2015 - 05:14)
PS поэтому нужно по возможности всегда использовать timestamp, а не datetime.

Тоесть мне лучше сделать поле timestamp. Сохранять туда дату как есть, без всех этих настроек предварительных. А уже при выборке изменять вывод даты с учетом зоны? Я правильно понимаю?

_____________
..Работает - не трогай!
killer8080
Разница в том, что timestamp не зависит от настроек сервера, и ты можешь смело использовать now() при инсертах/апдейтах. timestamp это целое число количества секунд от начала эпохи юникс в UTC. Юникс таймштамп универсален, когда ты делаешь селект, субд сама на лету конвертирует его в строковое представление согласно текущих настроек.
maximka787
Спасибо за совет. Так и сделаю. Мне главное, чтоб при инсертах и апдейтах заносиллсь верное число. А уж с выборкой как то да справлюсь. То есть мне при использовании now() пока что ничего менять не нужно? Я про настройки подключения к базе.
Модет такое быть, что изза неверных настроек самого сервера данные запишутся неверно?

_____________
..Работает - не трогай!
maximka787
Чтобы не было ошибок, решил сбросить зону.

mysql_pconnect('localhost','root','');
mysql_select_db('test');
mysql_query('SET NAMES utf8');
mysql_query('SET time_zone = "+00:00"');


По идее TS запишется корректно.

Что касается вывода, решение найдено.

SELECT CONVERT_TZ(NOW(), @@session.time_zone, '+03:00')

+ зависит от зоны юзера, которую он укажет при регистрации.

_____________
..Работает - не трогай!
killer8080
Цитата (maximka787 @ 12.08.2015 - 09:53)
Мне главное, чтоб при инсертах и апдейтах заносиллсь верное число. А уж с выборкой как то да справлюсь. То есть мне при использовании now() пока что ничего менять не нужно?

Ну у тебя же поля datetime, в них время пишется относительно текущей time_zone, поэтому нужно прописывать эту переменную при каждом подключении к бд.
SET time_zone = '+03:00'

Вообще для универсальности считается хорошим тоном держать БД в UTC, а форматировать уже при выводе в часовом поясе клиента.

UPD сам опередил :)
killer8080
Цитата (maximka787 @ 12.08.2015 - 10:36)
+ зависит от зоны юзера, которую он укажет при регистрации.

для анонимов можно определять их часовой пояс через JS
document.cookie = 'tz='+(new Date().getTimezoneOffset());
maximka787
Благодарю за помощь killer8080.
Вроде разобрался.

_____________
..Работает - не трогай!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.