Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Серверное время и часовые пояса / 25 сообщений из 65, страница 1 из 3
09.06.2010, 11:33
    #36677493
nodir_azam
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серверное время и часовые пояса
Есть таблица
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 минуты) промежуток вызывает инициатор джобов, задачей которого является запустить программу экзекутор, а далее и сам джоб.
...
Рейтинг: 0 / 0
09.06.2010, 11:34
    #36677496
nodir_azam
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серверное время и часовые пояса
СПАСИБО !! ))) Забыл дописать )
...
Рейтинг: 0 / 0
09.06.2010, 14:01
    #36678110
MBG
MBG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серверное время и часовые пояса
Если задания для каждого пользователя вставлены в его родном часовом поясе, то проблемы вовсе нет.

P.S. Серверная временная зона фиксирована и задается при установке постгреса. Зато можно менять сессионную зону, что обычно и делается.
...
Рейтинг: 0 / 0
09.06.2010, 14:11
    #36678152
nodir_azam
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серверное время и часовые пояса
Спасибо, в принципе я понял как это сделать. Нужно еще одно поле в таблице timezones, что понимал постгрес. Например в формате UTC.
при вставке делать
Код: plaintext
$dateUser with time zone serverUtcOffset 
для серверного времени
Код: plaintext
$dateUser 
- для user_date
Я правильно понимаю?

P.S. Все же одну переменную придется получать от пользователя, это дата выполнения джоба в указанное пользователем время
...
Рейтинг: 0 / 0
09.06.2010, 15:10
    #36678372
assa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серверное время и часовые пояса
Код: plaintext
SET [ SESSION | LOCAL ] TIME ZONE { timezone | LOCAL | DEFAULT }
http://www.postgresql.org/docs/8.1/static/sql-set.html

Код: plaintext
1.
2.
3.
4.
5.
show TimeZone;
SEt SESSION TimeZone TO "Asia/Baku";--UTC ;
RESET TimeZone;

--справочно--
SELECT *FROM pg_timezone_names;
...
Рейтинг: 0 / 0
09.06.2010, 15:24
    #36678404
nodir_azam
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серверное время и часовые пояса
на всю сессию?
Может лучше в переменную писать нужное значение даты и времени?
А если в той же сессии (а это так и будет) есть операции других пользователей.
Пользователь - это просто строка из таблицы users, в данном случае,
а не пользователь Postgres.
...
Рейтинг: 0 / 0
09.06.2010, 17:45
    #36678886
MBG
MBG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серверное время и часовые пояса
nodir_azamна всю сессию?
Может лучше в переменную писать нужное значение даты и времени?


Явно не лучше. Но если очень хочется - дело ваше.

nodir_azamА если в той же сессии (а это так и будет) есть операции других пользователей.


В одном подключении к БД выполнять два и более запросов _одновременно_ - нельзя. Тем более, я сильно сомневаюсь, что вы расшариваете дескрипторы между потоками...
...
Рейтинг: 0 / 0
09.06.2010, 18:13
    #36678945
nodir_azam
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серверное время и часовые пояса
MBG,
Нет, дескрипторы не расшариваются. Понятно, спасибо.
...
Рейтинг: 0 / 0
10.06.2010, 08:14
    #36679724
905
905
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серверное время и часовые пояса
nodir_azam,

а почему не хранить в заданиях время в UTC ?
при этом во время вставки в таблицу время будет преобразовано (клиентом) из локольной зоны клиента в UTC
тогда на сервере демон, выполняющий задания, будет работать по UTC или по локальному времени сервера
и не нужно никаких таблиц зон
...
Рейтинг: 0 / 0
10.06.2010, 11:54
    #36680155
nodir_azam
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серверное время и часовые пояса
905,

Код: plaintext
1.
 _userdate::timestamp at time zone 'UTC'

Вот так?
...
Рейтинг: 0 / 0
10.06.2010, 12:33
    #36680322
905
905
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серверное время и часовые пояса
nodir_azam,

таймзону можно и не указавать, т.к. timestamp создается по умолчанию "without time zone"
...
Рейтинг: 0 / 0
10.06.2010, 14:16
    #36680640
nodir_azam
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серверное время и часовые пояса
905,

Позвольте уточнить.
Я значит в таблице делаю поле without time zone и все?
Как приводить дату к UTC в постгресе?
...
Рейтинг: 0 / 0
10.06.2010, 14:36
    #36680713
Warstone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серверное время и часовые пояса
905 немного не понимает идеологию работы с Postgres. Тут идея такова, если у вас таимзона +3 (Москва) и вы пишите timestamp with time zone время 3 часа дня, то тут-же сделав SELECT этой записи с таимзоной 0, вы получите 12 часов дня. То есть postgres все сделает за вас. Так-же и с кодировками. В кодировках - прозрачное преобразование и в таимстампах такое-же прозрачное преобразование таим зон.

Фактически ответ на ваш вопрос будет таков: За вас это сделает PostgreSQL и отдат вам измененное время, если ваша таим-зона и таим-зона значения будут отличаться.
...
Рейтинг: 0 / 0
10.06.2010, 15:32
    #36680923
nodir_azam
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серверное время и часовые пояса
Господа, я совсем запутался. Давайте вернемся в начало.

Я сижу в Москве у меня 15 часов 26 минут. Пишу джоб на 16 часов 26 минут. Сервер с Postgres SQL находится к примеру в США. Там время 7 часов 26 минут утра, на сервере я должен указать время именно в США, значит 8 часов 26 минут.
Что я делаю:
Код: plaintext
1.
2.
_userDate = '2010-06-10 16:26:00'::timestamp at time zone 'UTC+3'
_startDate = _userDate at time zone 'UTC-5' 

так? мне вот кажется что, как-то не так...
...
Рейтинг: 0 / 0
10.06.2010, 15:37
    #36680937
Warstone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серверное время и часовые пояса
nodir_azamГоспода, я совсем запутался. Давайте вернемся в начало.

Я сижу в Москве у меня 15 часов 26 минут. Пишу джоб на 16 часов 26 минут. Сервер с Postgres SQL находится к примеру в США. Там время 7 часов 26 минут утра, на сервере я должен указать время именно в США, значит 8 часов 26 минут.
Что я делаю:
Код: plaintext
1.
2.
_userDate = '2010-06-10 16:26:00'::timestamp at time zone 'UTC+3'
_startDate = _userDate at time zone 'UTC-5' 

так? мне вот кажется что, как-то не так...Вы делаете INSERT с 16:26 +3UTC в базу (то есть со своим UTC).
А на сервере спрашиваете с UTC -5(опять-таки UTC сервера) и там это время будет показано как 8:26 -5UTC.

В конце-концов, что вам мешает проверить?
...
Рейтинг: 0 / 0
10.06.2010, 15:40
    #36680945
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серверное время и часовые пояса
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.
...
Рейтинг: 0 / 0
10.06.2010, 15:42
    #36680950
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серверное время и часовые пояса
автор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, переводить нужно?
...
Рейтинг: 0 / 0
10.06.2010, 15:42
    #36680955
nodir_azam
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серверное время и часовые пояса
Код: plaintext
SET SESSION TimeZone TO 
более или менее понятен.
Ставлю таймзону пользователя, и делаю вставку в БД.
А при выборке ничего не указываю и по умолчанию берется серверное время,
а точнее именно то время, которое указал пользователь для старта задания.
Я правильно понимаю? Тогда хранить таймзоны пользователей надо обязательно
...
Рейтинг: 0 / 0
10.06.2010, 15:44
    #36680959
nodir_azam
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серверное время и часовые пояса
Ёш,

Нет, не стоит переводить.
...
Рейтинг: 0 / 0
10.06.2010, 15:44
    #36680962
Warstone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серверное время и часовые пояса
Вот вам, чтоб развеять все проблемы, все давно украдено до вас:
Код: plaintext
1.
2.
3.
4.
CREATE TEMP TABLE test AS (
	SELECT now()::timestamp with time zone as time_date, now()::text as string_date
);
SEt SESSION TimeZone TO - 5 ;
SELECT * FROM test;
Код: plaintext
"2010-06-10 06:43:58.864689-05";"2010-06-10 16:43:58.864689+05"
...
Рейтинг: 0 / 0
10.06.2010, 15:57
    #36681013
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серверное время и часовые пояса
nodir_azam, предлагаю обдумать что будет при переводе часов лето -> зима когда после 2:59:59 будет 2:00:00?

Если пользователь запросит выполнение задачи 31 октября 2010 в 02:30:00, должна ли задача два раза выполняться и какие «два часа ночи» имел ввиду пользователь когда добавлял задачу на 31 октября 2010 в 02:30:00, новые «зимние» (старые летние три часа ночи) или старые «летние»?
...
Рейтинг: 0 / 0
10.06.2010, 16:46
    #36681153
nodir_azam
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серверное время и часовые пояса
Ёш,

Если летнее время, то в 2:30 до перевода часов. Такой проблемы не должно быть, так как исполненные задания отмечаются или удаляются из очереди заданий.
...
Рейтинг: 0 / 0
10.06.2010, 17:50
    #36681328
nodir_azam
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серверное время и часовые пояса
Я вдоволь по-извращался со временем, все равно то, что мне надо не удалось получить.
Все четко работает, когда ставишь событие в серверном времени и показываешь в другой таймзоне. Например, я звонил в 17-46 по Москве, а на серваке время звонка зафиксировалось в локальном времени. И если я хочу сделать выборку и посмотреть время звонка по мск, ставлю в сессии и все ок, показывает что звонил в 17-46. Хотя на сервере хранится локальное время.
Но при передачи времени выполнения, происходит не совсем так. Я хочу чтобы мне позвонили в 18-46. Мне надо получается высчитать разницу таймзоны пользователя с серверным временем, отнять или прибавить его ко времени джоба и только потом записывать. Легче никак не получается.
...
Рейтинг: 0 / 0
10.06.2010, 18:05
    #36681364
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серверное время и часовые пояса
nodir_azamМне надо получается высчитать разницу таймзоны пользователя с серверным временем, отнять или прибавить его ко времени джоба и только потом записывать. Зачем? Это сервер сам делает для типа timestamp with time zone
...
Рейтинг: 0 / 0
10.06.2010, 18:31
    #36681397
nodir_azam
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Серверное время и часовые пояса
Ёш,

реальная ситуация.
UTC+02 - серверное время
UTC+03 - время пользователя
время выполнения задания 20-00 к примеру, а сейчас 18-00 к примеру по UTC+03.
На серваке во время установки задания 16-00, следовательно, задание со временем выполнения 20-00 по UTC+03 надо написать в 18-00 по UTC+02. Чтобы робот выполнил задание в 18-00 .
Как быть?
Время передается как параметр в функцию.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Серверное время и часовые пояса / 25 сообщений из 65, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]