|
|
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#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 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
nodir_azam, . У вас именно таймзоны (timezone) или разницы времён (timezone offset)? А то ведь есть ещё зимнее-летнее время, и на стыке риск выполнить работу дважды за ночь или не выполнить вовсе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2010, 19:09 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
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, то где-то на час сбито время. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2010, 21:03 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
Warstone905 немного не понимает идеологию работы с Postgres ... да, после более внимательного прочтение главы "Date/Time Types" мне стало яснее пожалуй ТС стоит сделать тоже самое ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2010, 09:03 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
По ходу мне кажется я нашел решение. При вставке перевожу дату в UTC. При выборке роботом джобов оставляю серверное время. Вроде пока все так как надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2010, 11:10 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
То есть вы принципиально не читаете что вам пишут. А зачем тогда эта тема? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2010, 13:09 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
Warstone, О чем Вы? Извините если я что-то упустил. Перечитаю еще раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2010, 13:30 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
Warstone, Вы о сбитом времени? А Помоему все нормально. http://www.worldtimezone.com/index_ru.php ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2010, 13:34 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
iv_an_ru, Вариант с оффсетом тоже привлекателен. То есть не указывая определенной даты, говорить через час, день, три часа или пять суток? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2010, 13:58 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
nodir_azamWarstone, Вы о сбитом времени? А Помоему все нормально. http://www.worldtimezone.com/index_ru.phpЯ не о сбитом времени я о том, что если вы в Москве сейчас 16 часов, вы заносите 17 часов, а на сервере 5 часов, то для сервера это будет 6 часов. То есть вы тупо делаете INSERT now() + INTERVAL '1 hour' и он будет "+1 hour" и для сервера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2010, 19:08 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
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 часов, и с переходными датами получается полный цирк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2010, 10:58 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
iv_an_ru, Да это понятно. Пока не знаю как сделать для дней, в которые меняется время. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2010, 11:38 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
Неужели нет шедулера для постгрес? Может не писать ничего, а просто воспользоваться нормальным шедулером? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2010, 11:39 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
nodir_azamiv_an_ru, Да это понятно. Пока не знаю как сделать для дней, в которые меняется время.Вы тролль? Сколько раз вам повторить что все сделано командой Postgres за вас? Шедуллер есть pg_agent. Но не сильно рекомендуется им пользоваться. Обычно пользуются cron'ом и он всех устраивает. Проблема только в том, что он под никсами (для виндоузятников) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2010, 12:17 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
Warstone, нет не тролль :) Вы читали пост выше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2010, 13:09 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
nodir_azam, В общем предлагаю закрыть thread, так как он теряет смысл. Скрипт работает, время покажет что будет в переходе на летнее/зимнее время. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2010, 13:11 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
nodir_azamWarstone, нет не тролль :) Вы читали пост выше?Читал. И я не понимаю зачем приводить к +0 UTC, если тут прекрасно справляется механизм по умлочанию. Может и я не прав... Распишите еще раз задачу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2010, 16:28 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
WarstoneИ я не понимаю зачем приводить к +0 UTC, если тут прекрасно справляется механизм по умлочанию. Может и я не прав... Распишите еще раз задачу. Интересно, какие тут могут быть резоны, я сам могу припомнить только один вариант, когда имеет смысл хранить время по Гринвичу - если требуется конвертация в другую СУБД (или зачем-то надо парсить дамп скриптом, хотя это сильно на любителя). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2010, 18:31 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
Warstone, Например, пользователь в Москве, вводит время джоба. Когда идет вставка на сервер, постгрес приводит время, ко времени сервера. Если переменная 21:00 по UTC+03, он ставит по UTC+02 в 21:00. Это время некорректное для джоба, надо в 21:00 по UTC+03 вставлять. Может я что неправильно делаю? Когда приводим переменную (21:00) к UTC, а выборку делаем в UTC+02, то все как надо работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2010, 00:37 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
Давайте разбираться. Для начала я привету тест: Код: plaintext 1. 2. Код: plaintext 1. 2. 3. 4. Тестируем дальше: Код: plaintext 1. 2. Дата во внутреннем формате и Дата в текстовом выражении. Теперь поменяем TimeZone: Код: plaintext 1. 2. 3. То есть если вы в Москве прибавите один час к now() и запишите это в колонку с типом timestamp tz , то на сервере это будет так-же now() + 1 час, но во времени сервера. Все эти махинации я сделал что-бы объяснить одну вещь: В случае тасков, задания, которые надо выполнить можно брать путем Код: plaintext Надеюсь данный опус объяснил вам что ничего никуда конвертировать не надо. Вносите ту дату, которую выбрал пользователь, на кроне или что вы будите запускать - время будет с учетом GMT разницы между клиентами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2010, 02:42 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
Да, Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2010, 02:43 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
nodir_azamWarstone, Например, пользователь в Москве, вводит время джоба. Когда идет вставка на сервер, постгрес приводит время, ко времени сервера. Если переменная 21:00 по UTC+03, он ставит по UTC+02 в 21:00. Это время некорректное для джоба, надо в 21:00 по UTC+03 вставлять. Может я что неправильно делаю? Когда приводим переменную (21:00) к UTC, а выборку делаем в UTC+02, то все как надо работает.А вообще, в вашем случае полезно еще спросить Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2010, 02:45 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
Пардон, читать как +3 на клиенте, хотя вы ожидаете +2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2010, 02:46 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
Warstone, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 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. Делаем выборку Код: plaintext 1. 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'? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2010, 10:30 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
nodir_azamА вот когда делать set session timezone to '+4'? летом? А зимой что ставить? Или можно просто ставить set session timezone to 'Europe/Moscow'?А set session timezone делать вообще не надо. По умолчанию клиент берет таимзону из настроек ОС, то есть все по умолчанию отслеживаться будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2010, 15:08 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
Warstone, Тогда вставка будет неправильной, если не делать set session timezone, нет? Опять Вы меня запутали :). Вставим 2010-06-13 10:21:00 и на сервере будет 2010-06-13 10:21:00, а не 2010-06-13 08:21:00. Я не прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2010, 16:38 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
Вставка делается на сайте и время сайта отличается от времени клиента. Сам джоб - это звонок или СМС. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2010, 16:40 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
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 клиента. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2010, 20:01 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
Warstone, У меня web-сервер в UTC+3, клиент для всех - веб-клиент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2010, 20:57 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
nodir_azamWarstone, У меня web-сервер в UTC+3, клиент для всех - веб-клиент.Гм... тогда для всех дат у вас будет UTC+3 при инициализации подключения. А вот дальше... Советую читать HTTP заголовки. Там, насколько я помню, таимзона передается... На основе нее делать SET LOCAL/SESSION TimeZone (в зависимости от того, как вы работаете. Что конкретнее - прочитаете в манах по SET). Тогда у вас будут попадать в базу верные даты и вы можете выбирать оттуда таски. Более того, если вы вдруг решите что сервер звонилки должен быть отдельно, а может и не один и в разных часовых поясах - то вот тогда вам будет удобно проверять время не заботясь об этих самых поясах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2010, 23:00 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
Warstone, да, я примерно также себе представлял. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2010, 23:45 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
WarstoneСоветую читать HTTP заголовки. Там, насколько я помню, таимзона передается... Нет, не передается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2010, 17:34 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
MBGНет, не передается.Передается, но в другую сторону. Тогда ничего не остается, кроме как из JS new Date чего-нибудь вымутить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2010, 21:21 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
WarstoneТогда ничего не остается, кроме как из JS new Date чего-нибудь вымутить. Временную зону - не получится. Ну, "чего-нибудь вымутить" можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2010, 23:04 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
nodir_azamА зимой что ставить? Или можно просто ставить set session timezone to 'Europe/Moscow'?можно, описание зоны Europe/Moscow содержит информацию о том, когда нужно переводить часы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2010, 04:20 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
стыдно, но спрошу: хочу иметь timestamp (именно without...) в серверном timezone. в клиентском сеансе LOCALTIMESTAMP получаю в клиентском же времени. сказать RESET TimeZone внутри пишущей хранимки -- не помогает (не понял, почему) как получить серверную TimeZone ? (чтобы сказать Set TimeZone, или выставить переменную окружения ф-ии-- серверную, но не битым текстом /что может поменяться при смене настроек сервера/, а как исчислимую ф-ю). а то SELECT current_setting('TimeZone') возвращает сессионный (т.е. клиентский) ps простите за некропост ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2014, 15:35 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
"переформулирую" можно ли получить локальное (в локальной системе отсчета сервера) время сервера (without timezone) в сессии клиента ? т.е. сделать что-то типа : Код: sql 1. но с более надежным , чем current_setting('log_timezone') & //который может, вероятно, отличаться от серверного timezone ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2014, 17:17 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
qwwq, pl/perl'ом сходить в шелл? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2014, 12:19 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
tadmin, я, ващето, могу сходить в dblink "под себя". Но не хочу. Из принципа. Судя по всему, замечательные разработчики "абсолютного времени" timestamptz, специально вилки попрятали, чтобы затруднить использование выделенного серверного времени без "with timezone"-- интерфейсов. им, очевидно, хотелось , чтобы их называли гнойными альтернативно ориентированными гайсами. и таки они своего добились, если чо а чего, вроде бы, проще - дать усеру выделенное (системой координат) серверное время -- типа systimestamp(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2014, 13:20 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
qwwq хотелось , чтобы Видимо, сильно прятались от непредсказуемого разнообразия систем и их администраторов. Отсюда свой tzdata, к примеру. Думаю, в этом есть своя логика. Просто забыли оставить лазейку наружу. И java тоже не полагается на таймзоны системы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2014, 13:44 |
|
||
|
Серверное время и часовые пояса
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.03.2015, 18:24 |
|
||
|
|

start [/forum/topic.php?all=1&fid=53&tid=1998141]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
168ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 463ms |

| 0 / 0 |
