|
|
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
Есть таблица CREATE TABLE "public"."userjobs" ( "id" SERIAL, "userid" INTEGER NOT NULL, "from" VARCHAR(50), "to" VARCHAR(50) NOT NULL, "smstext" VARCHAR(160), "jobtype" INTEGER DEFAULT 1 NOT NULL, "date_user" TIMESTAMP WITH TIME ZONE NOT NULL, "date_server" TIMESTAMP WITHOUT TIME ZONE NOT NULL, "executing" INTEGER DEFAULT 0 NOT NULL, "haserror" INTEGER DEFAULT 0 NOT NULL, "errormessage" VARCHAR(500), CONSTRAINT "pbxuserjobs_pkey" PRIMARY KEY("id") ) WITH OIDS; Собственно, для хранения джобов пользователей. Пользователи могут находится в разных странах и континентах, и их время будет отличатся от серверного. Часовые пояса пользователей хранятся в таблице. id tznames tznamesru-1 Fictitious Server Zone Серверное время1 (+0100) Algeria/Congo (+0100) Алжир/Конго2 (+0200) Egypt/South Africa (+0200) Египет/Северная Африка3 (+0300) Saudi Arabia (+0300) Саудовская Аравия4 (+0400) Oman (+0400) Оман5 (+0500) Pakistan (+0500) Пакистан6 (+0600) Bangladesh (+0600) Бангладеш7 (+0700) Thailand/Vietnam (+0700) Таиланд/Вьетнам8 (+0800) China/Malaysia (+0800) Китай/Малайзия9 (+0900) Japan/Korea (+0900) Япония/Корея10 (+1000) Queensland (+1000) Квинсленд11 (+1100) Micronesia (+1100) Микронезия12 (+1200) Fiji (+1200) Фиджи13 (+1300) Tonga/Kiribati (+1300) Тонга/Кирибати14 (+1400) Christmas Islands (+1400) Остров Рождества15 (-0100) Azores/Cape Verde (-0100) Azores/Cape Verde16 (-0200) Fernando de Noronha (-0200) Fernando de Noronha17 (-0300) Argentina/Uruguay (-0300) Аргентина/Уругвай18 (-0400) Guyana (-0400) Guyana19 (-0500) Haiti/Peru (-0500) Гаити/Перу20 (-0600) Central America (-0600) Центральная Америка21 (-0700) Arizona (-0700) Arizona22 (-0800) Adamstown (-0800) Adamstown23 (-0900) Marquesas Islands (-0900) Marquesas Islands24 (-1000) Hawaii/Tahiti (-1000) Hawaii/Tahiti25 (-1100) Samoa (-1100) Samoa26 Asia/Afghanistan Азия/Афганистан27 Asia/India Азия/Индия28 Asia/Iran Азия/Иран29 Asia/Iraq Азия/Ирак30 Asia/Israel Азия/Израиль31 Asia/Jordan Азия/Иордания32 Asia/Lebanon Азия/Ливан33 Asia/Syria Азия/Сирия34 Australia/Adelaide Australia/Adelaide35 Australia/East Australia/East36 Australia/NorthernTerritory Australia/NorthernTerritory37 Europe/Central Европа/Центральная38 Europe/Eastern Европа/Восточная39 Europe/Moscow Россия/Москва40 Europe/Western Европа/Западная41 GMT (+0000) GMT (+0000)42 Newfoundland Newfoundland43 NewZealand/Auckland NewZealand/Auckland44 NorthAmerica/Alaska NorthAmerica/Alaska45 NorthAmerica/Atlantic NorthAmerica/Atlantic46 NorthAmerica/Central NorthAmerica/Central47 NorthAmerica/Eastern NorthAmerica/Eastern48 NorthAmerica/Mountain NorthAmerica/Mountain49 NorthAmerica/Pacific NorthAmerica/Pacific50 Russia/Ekaterinburg Россия/Екатеринбург51 Russia/Irkutsk Россия/Иркутск52 Russia/Kamchatka Россия/Камчатка53 Russia/Krasnoyarsk Россия/Красноярск54 Russia/Magadan Россия/Магадан55 Russia/Novosibirsk Россия/Новосибирск56 Russia/Vladivostok Россия/Владивосток58 SouthAmerica/Brasil SouthAmerica/Brasil59 SouthAmerica/Chile SouthAmerica/Chile60 SouthAmerica/Paraguay SouthAmerica/Paraguay61 SouthAmerica/Venezuela SouthAmerica/Venezuela Каждый пользователь имеет ID timezone Вопрос - как приводить серверное время, ко времени пользователя? Чтобы в указанные им в поле date_user время запускать этот джоб. Желательно не выводя из функций параметром дату и время. P.S. Есть робот(демон) которой в N (не более 1 минуты) промежуток вызывает инициатор джобов, задачей которого является запустить программу экзекутор, а далее и сам джоб. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2010, 11:33 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
СПАСИБО !! ))) Забыл дописать ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2010, 11:34 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
Если задания для каждого пользователя вставлены в его родном часовом поясе, то проблемы вовсе нет. P.S. Серверная временная зона фиксирована и задается при установке постгреса. Зато можно менять сессионную зону, что обычно и делается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2010, 14:01 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
Спасибо, в принципе я понял как это сделать. Нужно еще одно поле в таблице timezones, что понимал постгрес. Например в формате UTC. при вставке делать Код: plaintext Код: plaintext Я правильно понимаю? P.S. Все же одну переменную придется получать от пользователя, это дата выполнения джоба в указанное пользователем время ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2010, 14:11 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
Код: plaintext Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2010, 15:10 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
на всю сессию? Может лучше в переменную писать нужное значение даты и времени? А если в той же сессии (а это так и будет) есть операции других пользователей. Пользователь - это просто строка из таблицы users, в данном случае, а не пользователь Postgres. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2010, 15:24 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
nodir_azamна всю сессию? Может лучше в переменную писать нужное значение даты и времени? Явно не лучше. Но если очень хочется - дело ваше. nodir_azamА если в той же сессии (а это так и будет) есть операции других пользователей. В одном подключении к БД выполнять два и более запросов _одновременно_ - нельзя. Тем более, я сильно сомневаюсь, что вы расшариваете дескрипторы между потоками... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2010, 17:45 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
MBG, Нет, дескрипторы не расшариваются. Понятно, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2010, 18:13 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
nodir_azam, а почему не хранить в заданиях время в UTC ? при этом во время вставки в таблицу время будет преобразовано (клиентом) из локольной зоны клиента в UTC тогда на сервере демон, выполняющий задания, будет работать по UTC или по локальному времени сервера и не нужно никаких таблиц зон ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2010, 08:14 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
905, Код: plaintext 1. Вот так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2010, 11:54 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
nodir_azam, таймзону можно и не указавать, т.к. timestamp создается по умолчанию "without time zone" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2010, 12:33 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
905, Позвольте уточнить. Я значит в таблице делаю поле without time zone и все? Как приводить дату к UTC в постгресе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2010, 14:16 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
905 немного не понимает идеологию работы с Postgres. Тут идея такова, если у вас таимзона +3 (Москва) и вы пишите timestamp with time zone время 3 часа дня, то тут-же сделав SELECT этой записи с таимзоной 0, вы получите 12 часов дня. То есть postgres все сделает за вас. Так-же и с кодировками. В кодировках - прозрачное преобразование и в таимстампах такое-же прозрачное преобразование таим зон. Фактически ответ на ваш вопрос будет таков: За вас это сделает PostgreSQL и отдат вам измененное время, если ваша таим-зона и таим-зона значения будут отличаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2010, 14:36 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
Господа, я совсем запутался. Давайте вернемся в начало. Я сижу в Москве у меня 15 часов 26 минут. Пишу джоб на 16 часов 26 минут. Сервер с Postgres SQL находится к примеру в США. Там время 7 часов 26 минут утра, на сервере я должен указать время именно в США, значит 8 часов 26 минут. Что я делаю: Код: plaintext 1. 2. так? мне вот кажется что, как-то не так... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2010, 15:32 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
nodir_azamГоспода, я совсем запутался. Давайте вернемся в начало. Я сижу в Москве у меня 15 часов 26 минут. Пишу джоб на 16 часов 26 минут. Сервер с Postgres SQL находится к примеру в США. Там время 7 часов 26 минут утра, на сервере я должен указать время именно в США, значит 8 часов 26 минут. Что я делаю: Код: plaintext 1. 2. так? мне вот кажется что, как-то не так...Вы делаете INSERT с 16:26 +3UTC в базу (то есть со своим UTC). А на сервере спрашиваете с UTC -5(опять-таки UTC сервера) и там это время будет показано как 8:26 -5UTC. В конце-концов, что вам мешает проверить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2010, 15:37 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
nodir_azamКак приводить дату к UTC в постгресе? http://www.postgresql.org/docs/current/static/datatype-datetime.html тип timestamp with time zone уже хранится на сервере в UTC, не надо ничего никуда приводить: авторFor timestamp with time zone, the internally stored value is always in UTC (Universal Coordinated Time, traditionally known as Greenwich Mean Time, GMT). An input value that has an explicit time zone specified is converted to UTC using the appropriate offset for that time zone. If no time zone is stated in the input string, then it is assumed to be in the time zone indicated by the system's timezone parameter, and is converted to UTC using the offset for the timezone zone. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2010, 15:40 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
авторWhen a timestamp with time zone value is output, it is always converted from UTC to the current timezone zone, and displayed as local time in that zone. To see the time in another time zone, either change timezone or use the AT TIME ZONE construct (see Section 9.9.3). nodir_azam, переводить нужно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2010, 15:42 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
Код: plaintext Ставлю таймзону пользователя, и делаю вставку в БД. А при выборке ничего не указываю и по умолчанию берется серверное время, а точнее именно то время, которое указал пользователь для старта задания. Я правильно понимаю? Тогда хранить таймзоны пользователей надо обязательно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2010, 15:42 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
Ёш, Нет, не стоит переводить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2010, 15:44 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
Вот вам, чтоб развеять все проблемы, все давно украдено до вас: Код: plaintext 1. 2. 3. 4. Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2010, 15:44 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
nodir_azam, предлагаю обдумать что будет при переводе часов лето -> зима когда после 2:59:59 будет 2:00:00? Если пользователь запросит выполнение задачи 31 октября 2010 в 02:30:00, должна ли задача два раза выполняться и какие «два часа ночи» имел ввиду пользователь когда добавлял задачу на 31 октября 2010 в 02:30:00, новые «зимние» (старые летние три часа ночи) или старые «летние»? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2010, 15:57 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
Ёш, Если летнее время, то в 2:30 до перевода часов. Такой проблемы не должно быть, так как исполненные задания отмечаются или удаляются из очереди заданий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2010, 16:46 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
Я вдоволь по-извращался со временем, все равно то, что мне надо не удалось получить. Все четко работает, когда ставишь событие в серверном времени и показываешь в другой таймзоне. Например, я звонил в 17-46 по Москве, а на серваке время звонка зафиксировалось в локальном времени. И если я хочу сделать выборку и посмотреть время звонка по мск, ставлю в сессии и все ок, показывает что звонил в 17-46. Хотя на сервере хранится локальное время. Но при передачи времени выполнения, происходит не совсем так. Я хочу чтобы мне позвонили в 18-46. Мне надо получается высчитать разницу таймзоны пользователя с серверным временем, отнять или прибавить его ко времени джоба и только потом записывать. Легче никак не получается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2010, 17:50 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
nodir_azamМне надо получается высчитать разницу таймзоны пользователя с серверным временем, отнять или прибавить его ко времени джоба и только потом записывать. Зачем? Это сервер сам делает для типа timestamp with time zone ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2010, 18:05 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
Ёш, реальная ситуация. UTC+02 - серверное время UTC+03 - время пользователя время выполнения задания 20-00 к примеру, а сейчас 18-00 к примеру по UTC+03. На серваке во время установки задания 16-00, следовательно, задание со временем выполнения 20-00 по UTC+03 надо написать в 18-00 по UTC+02. Чтобы робот выполнил задание в 18-00 . Как быть? Время передается как параметр в функцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2010, 18:31 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=36681328&tid=1998141]: |
0ms |
get settings: |
5ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
170ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
71ms |
get tp. blocked users: |
1ms |
| others: | 197ms |
| total: | 479ms |

| 0 / 0 |
