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

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

P.S. Все же одну переменную придется получать от пользователя, это дата выполнения джоба в указанное пользователем время
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #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
Серверное время и часовые пояса
    #36678404
nodir_azam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
на всю сессию?
Может лучше в переменную писать нужное значение даты и времени?
А если в той же сессии (а это так и будет) есть операции других пользователей.
Пользователь - это просто строка из таблицы users, в данном случае,
а не пользователь Postgres.
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36678886
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
nodir_azamна всю сессию?
Может лучше в переменную писать нужное значение даты и времени?


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

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


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

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

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

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

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

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

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

Нет, не стоит переводить.
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #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
Серверное время и часовые пояса
    #36681013
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nodir_azam, предлагаю обдумать что будет при переводе часов лето -> зима когда после 2:59:59 будет 2:00:00?

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

Если летнее время, то в 2:30 до перевода часов. Такой проблемы не должно быть, так как исполненные задания отмечаются или удаляются из очереди заданий.
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36681328
nodir_azam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я вдоволь по-извращался со временем, все равно то, что мне надо не удалось получить.
Все четко работает, когда ставишь событие в серверном времени и показываешь в другой таймзоне. Например, я звонил в 17-46 по Москве, а на серваке время звонка зафиксировалось в локальном времени. И если я хочу сделать выборку и посмотреть время звонка по мск, ставлю в сессии и все ок, показывает что звонил в 17-46. Хотя на сервере хранится локальное время.
Но при передачи времени выполнения, происходит не совсем так. Я хочу чтобы мне позвонили в 18-46. Мне надо получается высчитать разницу таймзоны пользователя с серверным временем, отнять или прибавить его ко времени джоба и только потом записывать. Легче никак не получается.
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36681364
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nodir_azamМне надо получается высчитать разницу таймзоны пользователя с серверным временем, отнять или прибавить его ко времени джоба и только потом записывать. Зачем? Это сервер сам делает для типа timestamp with time zone
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #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
25 сообщений из 65, страница 1 из 3
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Серверное время и часовые пояса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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