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

Спустя 1 час, 15 минут, 43 секунды (6.08.2012 - 08:45) Hello написал(а):
Первый вариант, часовой пояс должен учитываться при выводе.
Спустя 2 часа, 7 минут, 7 секунд (6.08.2012 - 10:52) inpost написал(а):
zvezda_t
Гуглим: к дате прибавить час, или Х часов. В БД храним лишь 1 дату, точку старта.
Гуглим: к дате прибавить час, или Х часов. В БД храним лишь 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 написал(а):
Спасибо, вам

Спустя 1 месяц, 7 часов, 43 минуты, 27 секунд (8.09.2012 - 14:09) zvezda_t написал(а):
Указываю зону с помощью date_default_timezone_set() .
А как время из БД преобразовать (в бд храниться как TIMESTAMP)?
А как время из БД преобразовать (в бд храниться как TIMESTAMP)?
Спустя 32 минуты, 43 секунды (8.09.2012 - 14:42) zvezda_t написал(а):
Из БД время передавать в ф-ию date()?
date("M-d-Y", $date_bd); - или в таком случае время уже фиксируется и будет для все одинаковое?
Почему d1 и d2 - выдает разные результаты, а date1 и date2 одинаковые?
Как мне использовать ф-цию date_default_timezone_set(), чтобы время полученное из БД менялось для нужного часового пояса?
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 формате
Советую исользовать для даты класс Даты.
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

Советую исользовать для даты класс Даты.
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,
совсем запуталась(((



совсем запуталась(((
Цитата |
В БД дату и время нужно хранить в TIMESTAMP |
у меня Oracle, там нет даты в unix формате.
Мне нужно записывать в текстовое поле значение даты как- 880997810 ?
Цитата |
Для корректного вывода даты и времени из бд, указываем пользовательскую временную зону |
как она выведется корректно, если это просто текстовое поле, а не поле даты

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


Спустя 28 минут, 43 секунды (10.09.2012 - 07:07) zvezda_t написал(а):
Попробовала использовать класс:
Получается ф-ция
возвращает одинаковые метки, для разных часовых поясов.
и в зависимости от установок объекта класса:
я могу получить смещение:
Метка одна - время разное. Уже полегче стало)))
Теперь вопрос, в поле какого формата в БД(Oracle) мне хранить саму метку "1347249296"?
Получается ф-ция
$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 - то работай с ним.
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
, спасибо

Спустя 3 часа, 20 минут, 26 секунд (10.09.2012 - 11:33) zvezda_t написал(а):
Умный мужчина показал, как еще проще:
Спасибо Oyeme :)
$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)