powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Серверное время и часовые пояса
65 сообщений из 65, показаны все 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
Серверное время и часовые пояса
    #36681456
Фотография iv_an_ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nodir_azam,
. У вас именно таймзоны (timezone) или разницы времён (timezone offset)? А то ведь есть ещё зимнее-летнее время, и на стыке риск выполнить работу дважды за ночь или не выполнить вовсе.
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36681613
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nodir_azamЁш,

реальная ситуация.
UTC+02 - серверное время
UTC+03 - время пользователя
время выполнения задания 20-00 к примеру, а сейчас 18-00 к примеру по UTC+03.
На серваке во время установки задания 16-00, следовательно, задание со временем выполнения 20-00 по UTC+03 надо написать в 18-00 по UTC+02. Чтобы робот выполнил задание в 18-00 .
Как быть?
Время передается как параметр в функцию.Если на серваке время 16 UTC +2, а на станции 18 UTC+3, то где-то на час сбито время.
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36681968
905
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Warstone905 немного не понимает идеологию работы с Postgres ...
да, после более внимательного прочтение главы "Date/Time Types" мне стало яснее
пожалуй ТС стоит сделать тоже самое )
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36682222
nodir_azam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По ходу мне кажется я нашел решение. При вставке перевожу дату в UTC. При выборке роботом джобов оставляю серверное время.
Вроде пока все так как надо.
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36682669
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть вы принципиально не читаете что вам пишут. А зачем тогда эта тема?
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36682735
nodir_azam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Warstone,
О чем Вы?
Извините если я что-то упустил. Перечитаю еще раз.
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36682746
nodir_azam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Warstone,
Вы о сбитом времени? А Помоему все нормально.
http://www.worldtimezone.com/index_ru.php
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36682815
nodir_azam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
iv_an_ru,

Вариант с оффсетом тоже привлекателен. То есть не указывая определенной даты, говорить через час, день, три часа или пять суток?
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36683621
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nodir_azamWarstone,
Вы о сбитом времени? А Помоему все нормально.
http://www.worldtimezone.com/index_ru.phpЯ не о сбитом времени я о том, что если вы в Москве сейчас 16 часов, вы заносите 17 часов, а на сервере 5 часов, то для сервера это будет 6 часов. То есть вы тупо делаете INSERT now() + INTERVAL '1 hour' и он будет "+1 hour" и для сервера.
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36684090
Фотография iv_an_ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nodir_azamВариант с оффсетом тоже привлекателен. То есть не указывая определенной даты, говорить через час, день, три часа или пять суток?

Вы не поняли.

Моя таймзона --- Новосибирск, NOVST, UTC+06:00 или UTC+07:00, в зависимости от зимнего/летнего времени. Пусть для простоты сервер живёт в UTC. Если я сейчас, летом, скажу, что задачу надо сделать первого января в 14:00 по местному, то надо, чтоб сервер понял, что tmiezone offset для NOVST будет в этот день +360 минут, а не +420 минут как сейчас, то есть если задача сегодня, то надо запомнить 07:00 UTC, а если в январе, то 08:00 UTC. А при создании, скажем, ежедневной задача в 02:30 по местному ваша аппликуха вообще должна отдельно уточнить у юзера поведение в переходные дни.

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

Да это понятно. Пока не знаю как сделать для дней, в которые меняется время.
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36684120
nodir_azam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Неужели нет шедулера для постгрес? Может не писать ничего, а просто воспользоваться нормальным шедулером?
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36684136
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nodir_azamiv_an_ru,

Да это понятно. Пока не знаю как сделать для дней, в которые меняется время.Вы тролль? Сколько раз вам повторить что все сделано командой Postgres за вас?

Шедуллер есть pg_agent. Но не сильно рекомендуется им пользоваться. Обычно пользуются cron'ом и он всех устраивает. Проблема только в том, что он под никсами (для виндоузятников)
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36684168
nodir_azam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Warstone,
нет не тролль :)
Вы читали пост выше?
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36684170
nodir_azam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nodir_azam,
В общем предлагаю закрыть thread, так как он теряет смысл.
Скрипт работает, время покажет что будет в переходе на летнее/зимнее время.
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36684263
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nodir_azamWarstone,
нет не тролль :)
Вы читали пост выше?Читал. И я не понимаю зачем приводить к +0 UTC, если тут прекрасно справляется механизм по умлочанию. Может и я не прав... Распишите еще раз задачу.
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36684339
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
WarstoneИ я не понимаю зачем приводить к +0 UTC, если тут прекрасно справляется механизм по умлочанию. Может и я не прав... Распишите еще раз задачу.

Интересно, какие тут могут быть резоны, я сам могу припомнить только один вариант, когда имеет смысл хранить время по Гринвичу - если требуется конвертация в другую СУБД (или зачем-то надо парсить дамп скриптом, хотя это сильно на любителя).
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36684672
nodir_azam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Warstone,
Например, пользователь в Москве, вводит время джоба. Когда идет вставка на сервер, постгрес приводит время, ко времени сервера. Если переменная 21:00 по UTC+03, он ставит по UTC+02 в 21:00. Это время некорректное для джоба, надо в 21:00 по UTC+03 вставлять.
Может я что неправильно делаю?
Когда приводим переменную (21:00) к UTC, а выборку делаем в UTC+02, то все как надо работает.
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36684708
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте разбираться.

Для начала я привету тест:
Код: plaintext
1.
2.
SELECT now();

"2010-06-13 02:28:50.233445+04"
То есть стоит Московское время. Теперь вот:
Код: plaintext
1.
2.
3.
4.
SET LOCAL TimeZone = '-2';
SELECT now(), now()::timestamp;

"2010-06-12 20:30:37.745314-02";"2010-06-12 20:30:37.745314"
То есть мы поставили локально что у нас -2 GMT и посмотрели результат. Результат простой: now() отдает текущее время с учетом TimeZone клиента.
Тестируем дальше:
Код: plaintext
1.
2.
CREATE TEMP TABLE test AS (
	SELECT now()::timestamp with time zone as time_date, now()::text as string_date
);
То есть мы создали таблицу из 2-х полей:
Дата во внутреннем формате и Дата в текстовом выражении. Теперь поменяем TimeZone:
Код: plaintext
1.
2.
3.
SET LOCAL TimeZone = - 5 ;
SELECT * FROM test;

"2010-06-12 17:33:59.028919-05";"2010-06-13 02:33:59.028919+04"
То есть мы видим, что клиент с +4 GMT вносит now и оно у него 02 33, но сервер (эмулируется через SET LOCAL TimeZone) с -5 GMT видит что это еще 12 число 17 33.

То есть если вы в Москве прибавите один час к now() и запишите это в колонку с типом timestamp tz , то на сервере это будет так-же now() + 1 час, но во времени сервера.

Все эти махинации я сделал что-бы объяснить одну вещь: В случае тасков, задания, которые надо выполнить можно брать путем
Код: plaintext
SELECT * FROM tasks WHERE start_time <= now()
при условии что start_time имеет тип timestamp tz и не надо морочить себе голову насчет GMT, надо только попросить Постгре этим заморочится. Просится путем добавления tz в конец timestamp.

Надеюсь данный опус объяснил вам что ничего никуда конвертировать не надо. Вносите ту дату, которую выбрал пользователь, на кроне или что вы будите запускать - время будет с учетом GMT разницы между клиентами.
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36684709
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да,
Код: plaintext
1.
2.
SELECT version()

"PostgreSQL 8.4.1 on amd64-portbld-freebsd8.0, compiled by GCC cc (GCC) 4.2.1 20070719  [FreeBSD], 64-bit"
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36684711
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nodir_azamWarstone,
Например, пользователь в Москве, вводит время джоба. Когда идет вставка на сервер, постгрес приводит время, ко времени сервера. Если переменная 21:00 по UTC+03, он ставит по UTC+02 в 21:00. Это время некорректное для джоба, надо в 21:00 по UTC+03 вставлять.
Может я что неправильно делаю?
Когда приводим переменную (21:00) к UTC, а выборку делаем в UTC+02, то все как надо работает.А вообще, в вашем случае полезно еще спросить
Код: plaintext
SELECT now()
И посмотреть какой там GMT стоит. Если +2, то это у вас на клиенте настройки сбиты и их надо править.
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36684712
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон, читать как +3 на клиенте, хотя вы ожидаете +2.
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36684770
nodir_azam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Warstone,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE TABLE "public"."test_dt" (
  "startdt" TIMESTAMP WITH TIME ZONE, 
  "textdatetime" VARCHAR( 100 )
) WITH OIDS;

-----
select now(); -- 2010-06-13 08:03:43 (+02)
----- делаем вставку в таймзоне пользователя
set session timezone to '+4';
insert into test_dt select now(),now()::text;
----- делаем выборку в таймзоне сервера
reset timezone;
select  now(), * from test_dt;

now startdt textdatetime2010-06-13 08:09:13.578234+02 2010-06-13 08:07:53.308389+02 2010-06-13 10:07:53.308389+04




Приводить к UTC не надо.
Так тоже работает.
Код: plaintext
1.
SEt SESSION timezone TO '+4';
insert into test_dt select '2010-06-13 10:21:00'::TIMESTAMPtz, '2010-06-13 10:21:00';

Делаем выборку

Код: plaintext
1.
reset timezone;
select  now(), * from test_dt;

now startdt textdatetime2010-06-13 08:22:13.847904+02 2010-06-13 08:07:53.308389+02 2010-06-13 10:07:53.308389+042010-06-13 08:22:13.847904+02 2010-06-13 08:21:00+02 2010-06-13 10:21:00

А вот когда делать set session timezone to '+4'? летом?
А зимой что ставить? Или можно просто ставить set session timezone to 'Europe/Moscow'?
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36684912
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nodir_azamА вот когда делать set session timezone to '+4'? летом?
А зимой что ставить? Или можно просто ставить set session timezone to 'Europe/Moscow'?А set session timezone делать вообще не надо. По умолчанию клиент берет таимзону из настроек ОС, то есть все по умолчанию отслеживаться будет.
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36684966
nodir_azam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Warstone,
Тогда вставка будет неправильной, если не делать set session timezone, нет?
Опять Вы меня запутали :).
Вставим 2010-06-13 10:21:00 и на сервере будет 2010-06-13 10:21:00, а не 2010-06-13 08:21:00.
Я не прав?
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36684969
nodir_azam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вставка делается на сайте и время сайта отличается от времени клиента. Сам джоб - это звонок или СМС.
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36685111
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nodir_azamWarstone,
Тогда вставка будет неправильной, если не делать set session timezone, нет?
Опять Вы меня запутали :).
Вставим 2010-06-13 10:21:00 и на сервере будет 2010-06-13 10:21:00, а не 2010-06-13 08:21:00.
Я не прав?В корне не правы. В вашем случае нет понятия вставим 2010-06-13 10:21:00. В вашем случае есть понятие вставим 2010-06-13 10:21:00 +3 GMT. Так как тип timestamptz. Таимзона берется из настроек ОС клиента. И, если GMT на клиенте отличается от GMT значения в записи, то произведется автоматическое конвертирование времени в GMT клиента.
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36685160
nodir_azam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Warstone,
У меня web-сервер в UTC+3, клиент для всех - веб-клиент.
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36685225
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nodir_azamWarstone,
У меня web-сервер в UTC+3, клиент для всех - веб-клиент.Гм... тогда для всех дат у вас будет UTC+3 при инициализации подключения. А вот дальше... Советую читать HTTP заголовки. Там, насколько я помню, таимзона передается... На основе нее делать SET LOCAL/SESSION TimeZone (в зависимости от того, как вы работаете. Что конкретнее - прочитаете в манах по SET). Тогда у вас будут попадать в базу верные даты и вы можете выбирать оттуда таски. Более того, если вы вдруг решите что сервер звонилки должен быть отдельно, а может и не один и в разных часовых поясах - то вот тогда вам будет удобно проверять время не заботясь об этих самых поясах.
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36685247
nodir_azam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Warstone,
да, я примерно также себе представлял.
Спасибо.
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36686143
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
WarstoneСоветую читать HTTP заголовки. Там, насколько я помню, таимзона передается...

Нет, не передается.
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36686477
Фотография Warstone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MBGНет, не передается.Передается, но в другую сторону. Тогда ничего не остается, кроме как из JS new Date чего-нибудь вымутить.
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36686615
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
WarstoneТогда ничего не остается, кроме как из JS new Date чего-нибудь вымутить.

Временную зону - не получится. Ну, "чего-нибудь вымутить" можно.
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #36686842
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nodir_azamА зимой что ставить? Или можно просто ставить set session timezone to 'Europe/Moscow'?можно, описание зоны Europe/Moscow содержит информацию о том, когда нужно переводить часы.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Серверное время и часовые пояса
    #38715037
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
стыдно, но спрошу:

хочу иметь timestamp (именно without...) в серверном timezone.
в клиентском сеансе LOCALTIMESTAMP получаю в клиентском же времени.
сказать RESET TimeZone внутри пишущей хранимки -- не помогает (не понял, почему)
как получить серверную TimeZone ? (чтобы сказать Set TimeZone, или выставить переменную окружения ф-ии-- серверную, но не битым текстом /что может поменяться при смене настроек сервера/, а как исчислимую ф-ю).

а то SELECT current_setting('TimeZone') возвращает сессионный (т.е. клиентский)

ps простите за некропост
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #38715234
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"переформулирую"

можно ли получить локальное (в локальной системе отсчета сервера) время сервера (without timezone) в сессии клиента ?

т.е. сделать что-то типа :
Код: sql
1.
SELECT clock_timestamp() AT TIME ZONE current_setting('log_timezone') ltz


но с более надежным , чем current_setting('log_timezone') &
//который может, вероятно, отличаться от серверного timezone
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #38715808
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

pl/perl'ом сходить в шелл?
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #38715924
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tadmin,
я, ващето, могу сходить в dblink "под себя".
Но не хочу.
Из принципа.


Судя по всему, замечательные разработчики "абсолютного времени" timestamptz, специально вилки попрятали, чтобы затруднить использование выделенного серверного времени без "with timezone"-- интерфейсов.

им, очевидно, хотелось , чтобы их называли гнойными альтернативно ориентированными гайсами.
и таки они своего добились, если чо

а чего, вроде бы, проще - дать усеру выделенное (системой координат) серверное время -- типа systimestamp().
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #38715957
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq хотелось , чтобы
Видимо, сильно прятались от непредсказуемого разнообразия систем и их администраторов. Отсюда свой tzdata, к примеру. Думаю, в этом есть своя логика. Просто забыли оставить лазейку наружу. И java тоже не полагается на таймзоны системы.
...
Рейтинг: 0 / 0
Серверное время и часовые пояса
    #38894988
?Ы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
-- Function: server_timestamp()

-- DROP FUNCTION server_timestamp();

CREATE OR REPLACE FUNCTION server_timestamp()
  RETURNS timestamp without time zone AS
$BODY$
	SELECT current_timestamp
				AT time zone 
					( SELECT reset_val FROM pg_settings WHERE name ilike 'TimeZone')
			;
$BODY$
  LANGUAGE sql STABLE SECURITY DEFINER
  COST 100;
ALTER FUNCTION server_timestamp()
  OWNER TO postgres;
COMMENT ON FUNCTION server_timestamp() IS 'current transaction timestamp AT server time zone';
...
Рейтинг: 0 / 0
65 сообщений из 65, показаны все 3 страниц
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Серверное время и часовые пояса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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