[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Разный часовые пояса
zvezda_t
Всем привет!

Подскажите, пожалуйста, как поступают в такой ситуации:
Мне нужно записывать информацию в БД, от двух филиалов нашей компании, которые находятся в разных часовых поясах.

В БД пишется информация в одном времени и уже при выводе, где нужно плюсуется/отнимается поправка на часовой пояс?
Или же в БД сразу нужно писать свое время для каждого часового пояса?

Кто сталкивался с подобными задачами, расскажите, пожалуйста, какие есть особенности и на что обратить внимание rolleyes.gif



Спустя 1 час, 15 минут, 43 секунды (6.08.2012 - 08:45) Hello написал(а):
Первый вариант, часовой пояс должен учитываться при выводе.

Спустя 2 часа, 7 минут, 7 секунд (6.08.2012 - 10:52) inpost написал(а):
zvezda_t
Гуглим: к дате прибавить час, или Х часов. В БД храним лишь 1 дату, точку старта.

Спустя 53 минуты, 54 секунды (6.08.2012 - 11:46) l@pteff написал(а):
Хранить дату в TIMESTAMP, чтобы она не зависела от локальных настроек, в php указывать зону юзера функцей date_default_timezone_set()

Спустя 1 день, 18 часов, 40 минут (8.08.2012 - 06:26) zvezda_t написал(а):
Спасибо, вам smile.gif

Спустя 1 месяц, 7 часов, 43 минуты, 27 секунд (8.09.2012 - 14:09) zvezda_t написал(а):
Указываю зону с помощью date_default_timezone_set() .
А как время из БД преобразовать (в бд храниться как TIMESTAMP)?

Спустя 32 минуты, 43 секунды (8.09.2012 - 14:42) zvezda_t написал(а):
Из БД время передавать в ф-ию date()?
date("M-d-Y", $date_bd); - или в таком случае время уже фиксируется и будет для все одинаковое?

ate_default_timezone_set('America/Los_Angeles');
echo "<br/>d1=".date('y-m-j H:i:s');
echo "<br/>date1=".date("y-m-j H:i:s", mktime(17, 36, 50, 12, 1, 1997));

date_default_timezone_set('Asia/Yekaterinburg');
echo "<br/>d2=".date('y-m-j H:i:s');
echo "<br/>date2=".date("y-m-j H:i:s", mktime(17, 36, 50, 12, 1, 1997));


Почему d1 и d2 - выдает разные результаты, а date1 и date2 одинаковые?

Как мне использовать ф-цию date_default_timezone_set(), чтобы время полученное из БД менялось для нужного часового пояса?

Спустя 4 часа, 3 минуты, 12 секунд (8.09.2012 - 18:45) killer8080 написал(а):
Цитата (zvezda_t @ 8.09.2012 - 14:42)
Почему d1 и d2 - выдает разные результаты, а date1 и date2 одинаковые?

все правильно, даты d1, d2 разные потому, что была изменена временная зона, а date1 и date2 одинаковые потому, что mktime генерит метку времени относительно текущей временной зоны, соответственно она в каждом случае возвращала разный результат. Сравни
echo mktime(17, 36, 50, 12, 1, 1997); 
date_default_timezone_set('America/Los_Angeles');
echo "<br />".mktime(17, 36, 50, 12, 1, 1997);


По поводу твоего вопроса
Цитата (zvezda_t @ 6.08.2012 - 07:29)
В БД пишется информация в одном времени и уже при выводе, где нужно плюсуется/отнимается поправка на часовой пояс?
Или же в БД сразу нужно писать свое время для каждого часового пояса?

В БД дату и время нужно хранить в TIMESTAMP, тогда она не будет зависеть от настроек локали. Для корректного вывода даты и времени из бд, при инициализации соединения, вместе с настройками кодировок, указываем пользовательскую временную зону, например
SET TIME_ZONE='+02:00';

Естественно временную зону пользователя нужно как то определять. Либо он вручную задет её в профиле, либо с помощью JS устанавливаем куку с его текущей временной зоной (наилучший вариант, если у него в ОС правильно указан часовой пояс) date_default_timezone_set() так же нужно использовать, чтобы настройки временных зон PHP и MySQL совпадали. Здесь правда есть свои подводные камни. Из-за того что в одних странах есть переход зимнее/летнее время, в других нет. В php это учитывается тем, что временная зона задается не смещением, а текстовым указанием местности, соответственно в нем есть своя база привязывающая к местности часовой пояс, и наличие сезонных переходов. Но опять же эту базу нужно периодически обновлять, т.к. из-за политических заморочек, в некоторых странах изменяются часовые пояса, вводятся или отменяются сезонные переходы. В mysql так же можно использовать именованные зоны, но для этого они должны быть прописаны в базе mysql, чего обычно нет на хостингах, поэтому надежней использовать смещения, как я уже показал выше.

Спустя 6 часов, 52 минуты, 45 секунд (9.09.2012 - 01:38) Oyeme написал(а):
Как тут и сказали Вам нужно хранить время в unix формате wink.gif

Советую исользовать для даты класс Даты.
http://php.net/manual/en/class.datetime.php

$date = new DateTime();
echo $date->getTimestamp();

http://php.net/manual/en/datetime.gettimestamp.php

Работа с зонами

http://www.php.net/manual/en/datetime.gettimezone.php

Спустя 1 день, 5 часов, 7 секунд (10.09.2012 - 06:38) zvezda_t написал(а):
killer8080, sad.gif sad.gif sad.gif

совсем запуталась(((

Цитата
В БД дату и время нужно хранить в TIMESTAMP

у меня Oracle, там нет даты в unix формате.
Мне нужно записывать в текстовое поле значение даты как- 880997810 ?

Цитата
Для корректного вывода даты и времени из бд, указываем пользовательскую временную зону

как она выведется корректно, если это просто текстовое поле, а не поле даты sad.gif ??

Если я на php установлю временные зоны, то в БД будет записываться время разных временных зон. так? Если мне нужно будет собрать статистику по всем зонам, то придется же поправки на время предусматривать? Или нет?

Цитата
тогда она не будет зависеть от настроек локали.

как это? я не понимаю sad.gif sad.gif

Спустя 28 минут, 43 секунды (10.09.2012 - 07:07) zvezda_t написал(а):
Попробовала использовать класс:
Получается ф-ция
$date->getTimestamp(); 

возвращает одинаковые метки, для разных часовых поясов.

и в зависимости от установок объекта класса:
я могу получить смещение:

$date = new DateTime(null, new DateTimeZone('Europe/London'));
$date->setTimestamp(1347249296);
//Результат: 1347249296 = 2012-09-10 04:54:56


$date = new DateTime(null, new DateTimeZone('Europe/Moscow'));
$date->setTimestamp(1347249296);
//Результат: 1347249296 = 2012-09-10 07:54:56


Метка одна - время разное. Уже полегче стало)))

Теперь вопрос, в поле какого формата в БД(Oracle) мне хранить саму метку "1347249296"?

Спустя 5 минут, 51 секунда (10.09.2012 - 07:13) Игорь_Vasinsky написал(а):
zvezda_t
Цитата
Мне нужно записывать в текстовое поле значение даты как- 880997810 ?

я в int не брезгаю

Цитата
если это просто текстовое поле, а не поле даты

да php пофиг, он видит кол-во секунд и с ними работает

Цитата
Если я на php установлю временные зоны, то в БД будет записываться время разных временных зон. так?

будет писаться одна зона, которую ты указала.

для просмотра статистики нужных временных зон нужно всего прибавлять или удалять опред-е кол-во часов.

Цитата
как это? я не понимаю

инициируя date_default_timezone_set - ты навязываешь всем одну зону, если ты доп-но спрашиваешь час пояс - то при выводе инфы юзеру - можешь манипулировать меткой - опираясь на часовой пояс юзера. тем самым - выводя информацию актуальную для опред. юзера.


Цитата
возвращает одинаковые метки, для разных часовых поясов.

ест-но, у тя же используется временая зона сервера, если ты её не переназначила

Цитата
Теперь вопрос, в поле какого формата в БД(Oracle) мне хранить саму метку

храни в оригинале)) int(11)

Спустя 6 минут, 51 секунда (10.09.2012 - 07:19) zvezda_t написал(а):
Цитата
храни в оригинале)) int(11)

Если я буду хранить время как int.
То мне придется метку времени передавать из php, и уже нельзя будет создать поле типа date со значением по умолчанию sysdate. так?
А ведь это было очень удобно, при модернизации записи - поле date обновляется автоматически.

Я не понимаю, если это обычное поле int, то каким образом мне поможет, эта настройка?
Цитата
Для корректного вывода даты и времени из бд, при инициализации соединения, вместе с настройками кодировок, указываем пользовательскую временную зону, например
SET TIME_ZONE='+02:00';


Спустя 2 минуты, 31 секунда (10.09.2012 - 07:22) zvezda_t написал(а):
И не понятно, как я буду писать запросы - с сортировками по дате, если дата будет храниться так: 1347249296 ???

Спустя 2 минуты, 14 секунд (10.09.2012 - 07:24) Игорь_Vasinsky написал(а):
sysdate. - какой формат? не unix?


2. не юзал. я бы просто добавлял, удалял кол-во часов пи выводе

так. я про оракл слышал тока из далека.

если есть аналог TIME STAMP - то работай с ним.

Спустя 11 минут, 54 секунды (10.09.2012 - 07:36) zvezda_t написал(а):
В Oracle нету unix формата

Спустя 3 минуты, 40 секунд (10.09.2012 - 07:40) Игорь_Vasinsky написал(а):
а как sysdate выглядит? time stamp?

Спустя 23 минуты, 24 секунды (10.09.2012 - 08:03) zvezda_t написал(а):
Цитата
а как sysdate выглядит? time stamp?

так: '08.09.2012 14:50:57'

А что если в БД время хранить в поле date, чтобы можно было запросы по нему нормальные писать, а уже на уровне php установить для всех одну временную зону так
date_default_timezone_set('Asia/Yekaterinburg');

и потом конвертировать формат 'd.m.Y H:i:s' в метку Timestamp так:

     date_default_timezone_set('Asia/Yekaterinburg');
echo date('d.m.Y H:i:s', strtotime('08.09.2012 14:50:57'));
echo '<br/>';
//Результат:08.09.2012 14:50:57

$date = new DateTime(null, new DateTimeZone('Europe/Moscow'));
$date->setTimestamp(strtotime('08.09.2012 14:50:57'));
echo $date->format('d.m.Y H:i:s') . "\n";
//Результат:08.09.2012 12:50:57

$date = new DateTime(null, new DateTimeZone('Asia/Yekaterinburg'));
$date->setTimestamp(strtotime('08.09.2012 14:50:57'));
echo $date->format('d.m.Y H:i:s') . "\n";
//Результат:08.09.2012 14:50:57

$date = new DateTime(null, new DateTimeZone('Europe/London'));
$date->setTimestamp(strtotime('08.09.2012 14:50:57'));
echo $date->format('d.m.Y H:i:s') . "\n";
//Результат:08.09.2012 09:50:57


Или можно проще?

Спустя 6 минут, 4 секунды (10.09.2012 - 08:09) Игорь_Vasinsky написал(а):
наверн обёрткой красивей

$dateAct = '08.09.2012 14:50:57';
$zone = 'Europe/London';


function getDate($date, $zone){
$date = new DateTime(null, new DateTimeZone($zone));
$date->setTimestamp(strtotime($dateAct));
return $date->format('d.m.Y H:i:s') . "\n";
}

вызов

echo getDate($date, $zone);


или на прямки

echo getDate('08.09.2012 14:50:57', 'Europe/London');

Спустя 3 минуты, 48 секунд (10.09.2012 - 08:13) zvezda_t написал(а):
Игорь_Vasinsky smile.gif , спасибо

Спустя 3 часа, 20 минут, 26 секунд (10.09.2012 - 11:33) zvezda_t написал(а):
Умный мужчина показал, как еще проще:

$date = new DateTime('08.09.2012 14:50:57');
$date->setTimezone(new DateTimeZone('Europe/London'));
echo $date->format('d.m.Y H:i:s');


Спасибо Oyeme :)


_____________

Что ты сделал сегодня - для завтра?
"Приидите ко Мне вси труждающиеся и обремененнии и Аз упокою вы, возмите иго Мое на себе и научитеся от Мене яко кроток есмь и смирен сердцем и обрящете покой душам вашим, иго бо Мое благо и бремя Мое легко есть."(Мф. 11:28-30)
Быстрый ответ:

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