Преобразование часового пояса Python - PullRequest
1 голос
/ 16 февраля 2012

У меня есть следующее время: 20111122050940.086000, и я хотел бы преобразовать в секунды, поэтому я использую следующий код:

def get_precision_datenum( self, datestring ):
        ymdhms, usec = datestring.split( '.' )

        timestamp = datetime.datetime.strptime( ymdhms, "%Y%m%d%H%M%S" )          
        datenum = mktime( timestamp.timetuple() ) + float( usec ) / 1000000
        print datenum;
        return  "%10.3f" % datenum

Когда я возвращаюсь назад, из секунд в кортежи время меньше, чем час. Пример вместо 2011-11-22 05:09:40, я получаю 2011-11-22 04:09:40.

Где я допустил ошибку?

1 Ответ

4 голосов
/ 16 февраля 2012

Если ваша строка даты в UTC:

from datetime import datetime
import calendar
import pytz

datestring = '20111122050940.086000'
ymdhms, usec = datestring.split('.')

dt = pytz.utc.localize(datetime.strptime(ymdhms, '%Y%m%d%H%M%S'))
calendar.timegm(dt.utctimetuple()) + float(usec) / 1000000.

отпечатки 1321938580.086 (независимо от часового пояса вашей системы)

Для печати в формате UTC:

dt_utc = pytz.utc.localize(datetime.utcfromtimestamp(1321938580.086))

# datetime.datetime(2011, 11, 22, 5, 9, 40, 86000, tzinfo=<UTC>)

dt_utc.strftime('%Y%m%d%H%M%S.%f')

# '20111122050940.086000'

если вы находитесь в другом часовом поясе, вы должны сначала преобразовать его:

dt_hu = dt_utc.astimezone(pytz.timezone('Europe/Budapest'))

# datetime.datetime(2011, 11, 22, 6, 9, 40, 86000, tzinfo=<DstTzInfo 'Europe/Budapest' CET+1:00:00 STD>)

, а затем распечатайте его:

dt_hu.strftime('%Y%m%d%H%M%S.%f')

# '20111122060940.086000'

Это работает независимо от вашего системного часового пояса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...