Так получилось, что до сего момента мне счастливилось всегда работать с временем как с секундами по Гринвичу и форматировать только их при выводе пользователю. Но тут возникла задача разбора дат такого вида:
Sun, 24 May 2009 18:44:49 +0400
Преобразовать надо в секунды по Гринвичу, естественно. Мне кажется что этот мой код - говно, хотя должен быть железобетонным, т.к даты получаются из очень хрупкого источника. Поэтому желательно получить как можно больше багов и советов по стилю. BTW, я в питоньих либах не особо шарю.
time_format = '%a, %d %b %Y %H:%M:%S'
time_format_without_century = '%a, %d %b %y %H:%M:%S'
tzsplit_pattern = re.compile(r'(?P<time>[^\s,]{3}\,?\s+\d{1,2}\s+'\
'[^\s]{3}\s+(?P<year>\d{2}|\d{4})\s+'\
'\d{1,2}\:\d{2}:\d{2})\s+'\
'(?P<tz>[+-]\d{2,6})')
def parse_date(self, arg):
## XXX: Fragile as shit
m = self.tzsplit_pattern.match(arg)
if m:
time_str = m.group('time')
tz_str = m.group('tz')
with_century = len(m.group('year')) == 4
time_struct = None
if with_century:
time_struct = time.strptime(time_str, self.time_format)
else:
time_struct = time.strptime(time_str, self.time_format_without_century)
offset_direction = tz_str[:1]
offset_hours = int(tz_str[1:3])
offset_mins = 0
offset_secs = 0
if len(tz_str) > 3:
offset_mins = int(tz_str[3:5])
if len(tz_str) > 5:
offset_secs = int(tz_str[5:7])
offset = offset_hours * 3600 + offset_mins * 60 + offset_secs
if offset_direction == '-':
offset = -offset
time0 = time.mktime((time_struct.tm_year, \
time_struct.tm_mon, \
time_struct.tm_mday, \
time_struct.tm_hour, \
time_struct.tm_min, \
time_struct.tm_sec, \
0, 0, 0)) - time.timezone + offset
return time0
else:
raise CantParseTimeException