python и TZ
Используй time.altzone и напиши об этом разработчикам Django
$ python
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> time.tzname
('MSK', 'MSK')
>>> time.timezone
-10800
>>> time.altzone
-14400
У них так http://code.djangoproject.com/browser/django/branches/relea...
Перепутали что ли? Они используют функцию dst для опредления, есть ли сохранение времени.
Вроде как логично. В доках сказано, что altzone только для тех, у кого время на дневное переводится.
Почему для MSK различаются altzone и timezone?
40 def utcoffset(self, dt):
41 if self._isdst(dt):
42 return timedelta(seconds=-time.altzone)
43 else:
44 return timedelta(seconds=-time.timezone)
45
46 def dst(self, dt):
47 if self._isdst(dt):
48 return timedelta(seconds=-time.altzone) - timedelta(seconds=-time.timezone)
49 else:
50 return timedelta(0)
59 def _isdst(self, dt):
60 tt = (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.weekday 0, -1)
61 try:
62 stamp = time.mktime(tt)
63 except (OverflowError, ValueError):
64 # 32 bit systems can't handle dates after Jan 2038, and certain
65 # systems can't handle dates before ~1901-12-01:
66 #
67 # >>> time.mktime1900, 1, 13, 0, 0, 0, 0, 0, 0
68 # OverflowError: mktime argument out of range
69 # >>> time.mktime1850, 1, 13, 0, 0, 0, 0, 0, 0
70 # ValueError: year out of range
71 #
72 # In this case, we fake the date, because we only care about the
73 # DST flag.
74 tt = (2037 + tt[1:]
75 stamp = time.mktime(tt)
76 tt = time.localtime(stamp)
77 return tt.tm_isdst > 0
Перепутали что ли? Они используют функцию dst для опредления, есть ли сохранение времени.
Вроде как логично. В доках сказано, что altzone только для тех, у кого время на дневное переводится.
The offset of the local DST timezone, in seconds west of UTC, if one is defined. This is negative if the local DST timezone is east of UTC (as in Western Europe, including the UK). Only use this if daylight is nonzero.
Почему для MSK различаются altzone и timezone?
Я в Django не силён, но на вид вроде правильно.
> Почему для MSK различаются altzone и timezone?
Потому что по tzdata у нас сейчас летнее время.
> Почему для MSK различаются altzone и timezone?
Потому что по tzdata у нас сейчас летнее время.
Разобрался с удалённым постом?
Поделись, мне тоже интересно.
Поделись, мне тоже интересно.
Да фиг его знает.
Я им вот такое написал. http://code.djangoproject.com/ticket/16899
Я всё равно не понимаю.
time.daylight, time.altzone, time.timezone не зависят от текущего времени, поэтому, видимо, для определения нужного смещения нужно применять магию с tm_isdst. Там есть свои фичи, типа одному локальному времени может соответствовать два UTC (одно с dst, другое без dst но это не важно.
Будем считать, что в году есть 2 часа неблагоприятных для работы.
дальше вроде как всё идёт к тому, что баг в самом time питона.
Т.к. единственная логика, которая у меня не вызывает отторжения такая:
есть timezone - для обычного, altzone - для альтернативного
если tm_isdst - 0, то применяем обычное, если 1, то альтернативное.
Тогда получается, что timezone возвращать 14400, о чём я в начале и написал. И что ожидают от time django-писатели.
Я им вот такое написал. http://code.djangoproject.com/ticket/16899
Я всё равно не понимаю.
time.daylight, time.altzone, time.timezone не зависят от текущего времени, поэтому, видимо, для определения нужного смещения нужно применять магию с tm_isdst. Там есть свои фичи, типа одному локальному времени может соответствовать два UTC (одно с dst, другое без dst но это не важно.
Будем считать, что в году есть 2 часа неблагоприятных для работы.
дальше вроде как всё идёт к тому, что баг в самом time питона.
Т.к. единственная логика, которая у меня не вызывает отторжения такая:
есть timezone - для обычного, altzone - для альтернативного
если tm_isdst - 0, то применяем обычное, если 1, то альтернативное.
Тогда получается, что timezone возвращать 14400, о чём я в начале и написал. И что ожидают от time django-писатели.
Теперь и то, что я сказал вызывает непринятие.
Как же узнать смещение прошлой зимой? только по файлу зоны.
Двумя значениями не обойтись. Т.е. нужен какой-то механизм не просто узнавать зимнее/летнее время по времени, а, использую магию файлов зон определять ещё и смещение.
Т.е. алгоритм в django предполагает, что зона не меняется. Летнее смещение и зимнее смещение остаётся одинаковым.
Как же узнать смещение прошлой зимой? только по файлу зоны.
Двумя значениями не обойтись. Т.е. нужен какой-то механизм не просто узнавать зимнее/летнее время по времени, а, использую магию файлов зон определять ещё и смещение.
Т.е. алгоритм в django предполагает, что зона не меняется. Летнее смещение и зимнее смещение остаётся одинаковым.
моё решение такое
>>> pp = time.mktime2011, 1, 13, 0, 0, 0, 0, 0, -1
>>> datetime.utcfromtimestamp(pp) - datetime.fromtimestamp(pp)
datetime.timedelta(0, -10800)
>>> p2 = time.mktime2011, 7, 13, 0, 0, 0, 0, 0, -1
>>> datetime.utcfromtimestamp(p2) - datetime.fromtimestamp(p2)
datetime.timedelta(0, -14400)
>>> p3 = time.mktime2011, 9, 28, 0, 0, 0, 0, 0, -1
>>> datetime.utcfromtimestamp(p3) - datetime.fromtimestamp(p3)
datetime.timedelta(0, -14400)
Да уж, что то в питоне намудрили
похоже на то же самое.
datetime.utcfromtimestamp(pp) - datetime.fromtimestamp(pp) вроде от этого бага не страдает.
По сути у всех этих (что по ссылке, что в джанго) был хак, который использовал инвариантность часовых поясов.
Пока timezone и altzone сохранялись - всё работало.
datetime.utcfromtimestamp(pp) - datetime.fromtimestamp(pp) вроде от этого бага не страдает.
По сути у всех этих (что по ссылке, что в джанго) был хак, который использовал инвариантность часовых поясов.
Пока timezone и altzone сохранялись - всё работало.
а на винде всё ок
>>> time.timezone
-14400
>>> time.altzone
-18000
>>> time.daylight
0
>>>
>>> time.timezone
-14400
>>> time.altzone
-18000
>>> time.daylight
0
>>>
чувак ответил, что мы сделали так, как было в доке по питону и что это у них там косяки
http://bugs.python.org/issue1647654
http://bugs.python.org/issue9527
http://bugs.python.org/issue1647654
http://bugs.python.org/issue9527
Оставить комментарий
Phoenix
В общем django устанавливает так же временную зону, поэтому в ней тоже не работает.