Как конвертировать GMT время в EST время с помощью python

Я хочу преобразовать время GMT в время EST и получить метку времени. Я попробовал следующее, но не знаю, как установить часовой пояс.

time = "Tue, 12 Jun 2012 14:03:10 GMT"
timestamp2 = time.mktime(time.strptime(time, '%a, %d %b %Y %H:%M:%S GMT'))

3 ответов


часовые пояса не встроены в стандартный Python - вам нужно использовать другую библиотеку. pytz - хороший выбор.

>>> gmt = pytz.timezone('GMT')
>>> eastern = pytz.timezone('US/Eastern')
>>> time = "Tue, 12 Jun 2012 14:03:10 GMT"
>>> date = datetime.datetime.strptime(time, '%a, %d %b %Y %H:%M:%S GMT')
>>> date
datetime.datetime(2012, 6, 12, 14, 3, 10)
>>> dategmt = gmt.localize(date)
>>> dategmt
datetime.datetime(2012, 6, 12, 14, 3, 10, tzinfo=<StaticTzInfo 'GMT'>)
>>> dateeastern = dategmt.astimezone(eastern)
>>> dateeastern
datetime.datetime(2012, 6, 12, 10, 3, 10, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>)

С помощью pytz

from datetime import datetime
from pytz import timezone
fmt = "%Y-%m-%d %H:%M:%S %Z%z"
now_time = datetime.now(timezone('US/Eastern'))
print now_time.strftime(fmt)

если это ваш локальный часовой пояс, и правила часового пояса одинаковы для данного времени, как и сейчас, вы можете использовать решение только для stdlib (за исключением некоторых крайних случаев):

#!/usr/bin/env python
from email.utils import parsedate_tz, mktime_tz
from datetime import datetime

timestamp = mktime_tz(parsedate_tz("Tue, 12 Jun 2012 14:03:10 GMT"))
print(datetime.fromtimestamp(timestamp))
# -> 2012-06-12 10:03:10

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

#!/usr/bin/env python
from email.utils import parsedate_tz, mktime_tz
from datetime import datetime
import pytz # $ pip install pytz

timestamp = mktime_tz(parsedate_tz("Tue, 12 Jun 2012 14:03:10 GMT"))
eastern_dt = datetime.fromtimestamp(timestamp, pytz.timezone('America/New_York'))
print(eastern_dt.strftime('%a, %d %b %Y %H:%M:%S %z (%Z)'))
# -> Tue, 12 Jun 2012 10:03:10 -0400 (EDT)

Примечание: POSIX timestamp то же самое во всем мире, т. е. ваш местный часовой пояс не важно, хотите ли вы найти метку времени (если ваш часовой пояс не "правильный"). Вот как преобразование времени utc в отметку времени.