Thread: Re: [pgsql-ru-general] Косяки с отменой летнего времени
On Sep 8, 2011, at 5:40 PM, Alexander M. Pravkin wrote: > Обновил сегодня системную zoneinfo (FreeBSD 8.2), привязал к ней же > postgresql (в 8.4.8 ещё не внесли tzdata 2011i). На момент вопроса решения я не знал, но в списке изменений 8.4.9 есть упоминание про апдейт информации о часовых поясах, думаю что проблема уже решена. > > Напоролся на интересный косяк: > > fduch@~=# SHOW timezone; > TimeZone > --------------- > Europe/Moscow > > fduch@~=# SET datestyle TO German ; > SET > fduch@~=# SELECT date_trunc('month', '01.09.2011 00:00:00 MSK'::timestamptz); > date_trunc > ------------------------- > 01.09.2011 00:00:00 MSK > > fduch@~=# SELECT date_trunc('month', '01.09.2011 00:00:00 MSK'::timestamptz) = '01.09.2011'::timestamptz; > ?column? > ---------- > t > > fduch@~=# SELECT date_trunc('month', '01.09.2011 00:00:00 MSK'::timestamptz) = '01.09.2011 00:00:00 MSK'::timestamptz; > ?column? > ---------- > f > > fduch@~=# select > extract(epoch from date_trunc('month', '01.09.2011 00:00:00 MSK'::timestamptz)), > extract(epoch from '01.09.2011'::timestamptz), > extract(epoch from '01.09.2011 00:00:00 MSK'::timestamptz); > date_part | date_part | date_part > ------------+------------+------------ > 1314820800 | 1314820800 | 1314824400 > > > Всё это связано с тем, что наша нынешняя TZ называется MSK и имеет +0400 > без DST, а у PG прописано: > > fduch@~=# SELECT * from pg_timezone_abbrevs where abbrev in ('MSK','MSD'); > abbrev | utc_offset | is_dst > --------+------------+-------- > MSD | 04:00:00 | t > MSK | 03:00:00 | f > > То есть output у него "правильный", а input из расчёта что MSK -- это > GMT+3 > > Вопрос вытекает сам собой: и что теперь делать-то? Может, кто-то уже > сталкивался? > > > -- > Alexander M. Pravkin > > -- > Sent via pgsql-ru-general mailing list (pgsql-ru-general@postgresql.org) > To make changes to your subscription: > http://www.postgresql.org/mailpref/pgsql-ru-general /A
On Mon, 2011-10-03 at 13:18 +0300, Alexey Klyukin wrote: > > Обновил сегодня системную zoneinfo (FreeBSD 8.2), привязал к ней же > > postgresql (в 8.4.8 ещё не внесли tzdata 2011i). > > На момент вопроса решения я не знал, но в списке изменений 8.4.9 есть упоминание про апдейт информации о часовых поясах, думаю что проблема уже решена. Уверен, что нет. tzdata-2011k в плане русских TZ ничем не изменилась, а в release notes от 4.8.9 нет ничего про таймзоны, кроме того что туда включили оный 2011k. Локально это можно пофиксить, пропатчив tzdata. Вариант 1: с весны 2011 прописать MSD вместо MSK, оставив isdst=1 Вариант 2: прописать какую-то новую аббревиатуру (например, MST), isdst=0, дописать её в share/postgresql/timezonesets/Europe.txt. Правильнее второй, но менять надо не только MSK/MSD, но и все остальные российские зоны. Чтобы пофиксить глобально -- наверное, надо пинать maintainer'ов tzdata. Сомневаюсь, что в PG сделают поддержку аббревиатур, меняющихся со временем. Ещё мне интересно, как с этим в оракле. Кто-нибудь может проверить? > > Напоролся на интересный косяк: > > > > fduch@~=# SHOW timezone; > > TimeZone > > --------------- > > Europe/Moscow > > > > fduch@~=# SET datestyle TO German ; > > SET > > fduch@~=# SELECT date_trunc('month', '01.09.2011 00:00:00 MSK'::timestamptz); > > date_trunc > > ------------------------- > > 01.09.2011 00:00:00 MSK > > > > fduch@~=# SELECT date_trunc('month', '01.09.2011 00:00:00 MSK'::timestamptz) = '01.09.2011'::timestamptz; > > ?column? > > ---------- > > t > > > > fduch@~=# SELECT date_trunc('month', '01.09.2011 00:00:00 MSK'::timestamptz) = '01.09.2011 00:00:00 MSK'::timestamptz; > > ?column? > > ---------- > > f > > > > fduch@~=# select > > extract(epoch from date_trunc('month', '01.09.2011 00:00:00 MSK'::timestamptz)), > > extract(epoch from '01.09.2011'::timestamptz), > > extract(epoch from '01.09.2011 00:00:00 MSK'::timestamptz); > > date_part | date_part | date_part > > ------------+------------+------------ > > 1314820800 | 1314820800 | 1314824400 > > > > > > Всё это связано с тем, что наша нынешняя TZ называется MSK и имеет +0400 > > без DST, а у PG прописано: > > > > fduch@~=# SELECT * from pg_timezone_abbrevs where abbrev in ('MSK','MSD'); > > abbrev | utc_offset | is_dst > > --------+------------+-------- > > MSD | 04:00:00 | t > > MSK | 03:00:00 | f > > > > То есть output у него "правильный", а input из расчёта что MSK -- это > > GMT+3 > > > > Вопрос вытекает сам собой: и что теперь делать-то? Может, кто-то уже > > сталкивался? > > > > > > -- > > Alexander M. Pravkin > > > > -- > > Sent via pgsql-ru-general mailing list (pgsql-ru-general@postgresql.org) > > To make changes to your subscription: > > http://www.postgresql.org/mailpref/pgsql-ru-general > > /A > -- Alexander M. Pravkin
5 октября 2011 г. 13:37 пользователь Alexander M. Pravkin <fduch@antar.bryansk.ru> написал: > On Mon, 2011-10-03 at 13:18 +0300, Alexey Klyukin wrote: >> > Обновил сегодня системную zoneinfo (FreeBSD 8.2), привязал к ней же >> > postgresql (в 8.4.8 ещё не внесли tzdata 2011i). >> >> На момент вопроса решения я не знал, но в списке изменений 8.4.9 есть упоминание про апдейт информации о часовых поясах, думаю что проблема уже решена. > > Уверен, что нет. tzdata-2011k в плане русских TZ ничем не изменилась, а > в release notes от 4.8.9 в релизнотах как раз написано про обновление временных зон "Update time zone data files to tzdata release 2011i for DST law changes in Canada, Egypt, Russia, Samoa, and South Sudan." + согласно коммиту http://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67efa666a5b29ecd19e0f3191a1433fbd5b75b8f отличается, и эти изменения в 8.4.9 присутсвуют -- All bugs reserved
On Wed, 2011-10-05 at 15:32 +0600, Timon wrote: > 5 октября 2011 г. 13:37 пользователь Alexander M. Pravkin > <fduch@antar.bryansk.ru> написал: > > On Mon, 2011-10-03 at 13:18 +0300, Alexey Klyukin wrote: > >> > Обновил сегодня системную zoneinfo (FreeBSD 8.2), привязал к ней же > >> > postgresql (в 8.4.8 ещё не внесли tzdata 2011i). > >> > >> На момент вопроса решения я не знал, но в списке изменений 8.4.9 есть упоминание про апдейт информации о часовых поясах, думаю что проблема уже решена. > > > > Уверен, что нет. tzdata-2011k в плане русских TZ ничем не изменилась, а > > в release notes от 4.8.9 > в релизнотах как раз написано про обновление временных зон > "Update time zone data files to tzdata release 2011i for DST law > changes in Canada, Egypt, Russia, Samoa, and South Sudan." > + согласно коммиту > http://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67efa666a5b29ecd19e0f3191a1433fbd5b75b8f > отличается, и эти изменения в 8.4.9 присутсвуют Я понимаю, что они присутствуют, но проблема как раз с новыми таймзонами. Напоминаю: у PG в timezonesets прописано, что MSK -- это строго +3 без DST, MSD -- строго +4 с DST, и никак иначе. А в новых tzdata MSK с 2011 года -- это +4 без DST, отсюда и грабли. -- Alexander M. Pravkin
Re: [pgsql-ru-general] Re: [pgsql-ru-general] Косяки с отменой летнего времени
From
Vladimir Rusinov
Date:
2011/10/5 Alexander M. Pravkin <fduch@antar.bryansk.ru>
On Wed, 2011-10-05 at 15:32 +0600, Timon wrote:Я понимаю, что они присутствуют, но проблема как раз с новыми
> 5 октября 2011 г. 13:37 пользователь Alexander M. Pravkin
> <fduch@antar.bryansk.ru> написал:
> > On Mon, 2011-10-03 at 13:18 +0300, Alexey Klyukin wrote:
> >> > Обновил сегодня системную zoneinfo (FreeBSD 8.2), привязал к ней же
> >> > postgresql (в 8.4.8 ещё не внесли tzdata 2011i).
> >>
> >> На момент вопроса решения я не знал, но в списке изменений 8.4.9 есть упоминание про апдейт информации о часовых поясах, думаю что проблема уже решена.
> >
> > Уверен, что нет. tzdata-2011k в плане русских TZ ничем не изменилась, а
> > в release notes от 4.8.9
> в релизнотах как раз написано про обновление временных зон
> "Update time zone data files to tzdata release 2011i for DST law
> changes in Canada, Egypt, Russia, Samoa, and South Sudan."
> + согласно коммиту
> http://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67efa666a5b29ecd19e0f3191a1433fbd5b75b8f
> отличается, и эти изменения в 8.4.9 присутсвуют
таймзонами.
Напоминаю: у PG в timezonesets прописано, что MSK -- это строго +3 без
DST, MSD -- строго +4 с DST, и никак иначе. А в новых tzdata MSK с 2011
года -- это +4 без DST, отсюда и грабли.
2:00 - EET 1930 Jun 21
3:00 Russia MSK/MSD 1991 Mar 31 2:00s
2:00 Russia EE%sT 1992 Jan 19 2:00s
- 3:00 Russia MSK/MSD
+ 3:00 Russia MSK/MSD 2011 Mar 27 2:00s
+ 4:00 - MSK
Если интуиция и здравый смысл меня не обманывают, эта запись означает что до 2011 Mar 27 Europe/Moscow - это MSK/MSD +03, а после - это просто MSK +4.
Vladimir Rusinov
http://greenmice.info/
On Wed, 2011-10-05 at 14:24 +0400, Vladimir Rusinov wrote: > > Напоминаю: у PG в timezonesets прописано, что MSK -- это строго +3 без > > DST, MSD -- строго +4 с DST, и никак иначе. А в новых tzdata MSK с 2011 > > года -- это +4 без DST, отсюда и грабли. > > > @@ -2042,7<http://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/timezone/data/europe;h=221b8504ad1d3abe98233cc76b5a30a5149cfc52#l2042> > +2063,8<http://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/timezone/data/europe;h=baed8fe334cbd3f6d53f6a358e4f1b086393544b;hb=67efa666a5b29ecd19e0f3191a1433fbd5b75b8f#l2063>@@ > Zone Europe/Moscow 2:30:20 - LMT 1880 > 2:00 - EET 1930 Jun 21 > 3:00 Russia MSK/MSD 1991 Mar 31 2:00s > 2:00 Russia EE%sT 1992 Jan 19 2:00s > - 3:00 Russia MSK/MSD > + 3:00 Russia MSK/MSD 2011 Mar 27 2:00s > + 4:00 - MSK > > Если интуиция и здравый смысл меня не обманывают, эта запись означает что до > 2011 Mar 27 Europe/Moscow - это MSK/MSD +03, а после - это просто MSK +4. Не обманывает. Только PG так не умеет. У него аббревиатура однозначно определяет смещение и признак DST. Мне здравый смысл тоже подсказывает, что нельзя было давать одинаковые аббревиатуры для "до" и "после". Посмотрите zdump -v Europe/Moscow -- при разных смещениях каждый раз аббревиатуры были разные. -- Alexander M. Pravkin