Преобразование даты и времени UTC с часовым поясом на локальный

У меня есть строка с датой в UTC и tzinfo

"Thu, 01 Oct 2015 00:02:01 +0200" 

Как сделать, чтобы преобразовать его в мое местное время, чтобы он выводил

 "2015-10-02 02:02:01" 

Я пытался

 parser.parse("Thu, 01 Oct 2015 00:02:01 +0200") 

но я не могу найти способ суммировать этот tzinfo со временем, чтобы получить свое местное время.

заранее спасибо

Изменить: вопрос отличается от того, как он включает разницу во времени в данной строке, и точка заключается в добавлении или уменьшении разницы в этом времени, которая иногда требует изменения даты, как в приведенном примере.

2 Solutions collect form web for “Преобразование даты и времени UTC с часовым поясом на локальный”

Вот решение stdlib:

 #!/usr/bin/env python from datetime import datetime from email.utils import parsedate_tz, mktime_tz timestamp = mktime_tz(parsedate_tz("Thu, 01 Oct 2015 00:02:01 +0200")) print(datetime.fromtimestamp(timestamp)) # get local time 

Формат входного времени – формат времени rfc 5322, который понимается модулем email . datetime.fromtimestamp() может не работать для прошлых / будущих дат, если он не использует базу данных хронологического времени на данной платформе. Портативным решением является использование модуля pytz для доступа к базе данных tz:

 #!/usr/bin/env python from datetime import datetime from email.utils import parsedate_tz, mktime_tz import tzlocal # $ pip install tzlocal local_timezone = tzlocal.get_localzone() # return pytz tzinfo timestamp = mktime_tz(parsedate_tz("Thu, 01 Oct 2015 00:02:01 +0200")) print(datetime.fromtimestamp(timestamp, local_timezone)) 

Я думаю, что следующее делает то, что вы хотите, реализуя пару конкретных классов tzinfo :

 from datetime import datetime, timedelta, tzinfo import time as _time _ZERO = timedelta(0) _STDOFFSET = timedelta(seconds=-_time.timezone) if _time.daylight: _DSTOFFSET = timedelta(seconds=-_time.altzone) else: _DSTOFFSET = _STDOFFSET _DSTDIFF = _DSTOFFSET - _STDOFFSET class UTC(tzinfo): """ Concrete tzinfo time zone class for UTC """ def utcoffset(self, dt): return _ZERO def tzname(self, dt): return "UTC" def dst(self, dt): return _ZERO UTC = UTC() class LocalTimezone(tzinfo): """ Concrete tzinfo time zone class for current timezone """ def utcoffset(self, dt): if self._isdst(dt): return _DSTOFFSET else: return _STDOFFSET def dst(self, dt): if self._isdst(dt): return _DSTDIFF else: return _ZERO def tzname(self, dt): return _time.tzname[self._isdst(dt)] # everything depends on this private method which assumes 'dt' argument # is in local time def _isdst(self, dt): tt = (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.weekday(), 0, -1) # last -1 means dst unknown (mktime will fill in) stamp = _time.mktime(tt) # mktime returns secs tt = _time.localtime(stamp) # localtime returns time_struct with tm_isdst attribute return tt.tm_isdst > 0 LOCAL = LocalTimezone() stamp = 'Thu, 01 Oct 2015 00:02:01 +0200' dt = datetime(*_time.strptime(' '.join(stamp.split()[:-1]), '%a, %d %b %Y %H:%M:%S')[:6], tzinfo=UTC) local_dt = dt.astimezone(LOCAL) print(local_dt.strftime('%Y-%M-%d %H:%M:%S')) 
Interesting Posts
Python - лучший язык программирования в мире.