Локализация Epoch Time с pytz в Python
Im работает над преобразованием временных меток времени в даты в разных часовых поясах с помощью pytz. Я пытаюсь создать объект DateTime, который принимает часовой пояс базы данных Olson и время эпохи и возвращает локализованный объект datetime. В конце концов мне нужно ответить на такие вопросы, как "Какой час был в Нью-Йорке в эпоху 1350663248?"
Здесь что-то не работает:
import datetime, pytz, time
class DateTime:
def __init__(self, timezone, epoch):
self.timezone = timezone
self.epoch = epoch
timezoneobject = pytz.timezone(timezone)
datetimeobject = datetime.datetime.fromtimestamp( self.epoch )
self.datetime = timezoneobject.localize(datetimeobject)
def hour(self):
return self.datetime.hour
if __name__=='__main__':
epoch = time.time()
dt = DateTime('America/Los_Angeles',epoch)
print dt.datetime.hour
dt = DateTime('America/New_York',epoch)
print dt.datetime.hour
Это печатает тот же час, тогда как на 3 часа вперед. Что здесь происходит? Я новичок на Python, любая помощь приветствуется!
Ответы
Ответ 1
datetime.fromtimestamp(self.epoch)
возвращает localtime, которое не должно использоваться с произвольным временным диапазоном localize(); вам нужно utcfromtimestamp()
получить datetime в UTC, а затем преобразовать его в желаемый часовой пояс:
from datetime import datetime
import pytz
# get time in UTC
utc_dt = datetime.utcfromtimestamp(posix_timestamp).replace(tzinfo=pytz.utc)
# convert it to tz
tz = pytz.timezone('America/New_York')
dt = utc_dt.astimezone(tz)
# print it
print(dt.strftime('%Y-%m-%d %H:%M:%S %Z%z'))
Или проще использовать конструкцию из временной метки:
from datetime import datetime
import pytz
# get time in tz
tz = pytz.timezone('America/New_York')
dt = datetime.fromtimestamp(posix_timestamp, tz)
# print it
print(dt.strftime('%Y-%m-%d %H:%M:%S %Z%z'))
Он преобразует из UTC неявно в этом случае.
Ответ 2
Для создания datetime
объекта, относящегося к определенному часовому поясу из временной метки unix, вы можете передать pytz
как параметр tz
при создании datetime
. Например:
>>> from datetime import datetime
>>> import pytz
>>> datetime.fromtimestamp(1350663248, tz= pytz.timezone('America/New_York'))
datetime.datetime(2012, 10, 19, 12, 14, 8, tzinfo=<DstTzInfo 'America/New_York' EDT-1 day, 20:00:00 DST>)
Вы можете получить список всех часовых поясов с помощью pytz.all_timezones
.
Также посмотрите Список часовых поясов базы данных tz.
Ответ 3
epochdt = datetime.datetime.fromtimestamp(epoch)
timezone1 = timezone("Timezone/String")
adjusted_datetime = timezone1.localize(epochdt)
Работа с памятью, поэтому извините любые синтаксические ошибки, но это должно привести вас к правильному пути.
EDIT: пропустил часть о знании часа и т.д. Python имеет отличное Форматирование времени/даты. В значительной степени дно этой ссылки - это таблица, показывающая, как извлекать различные атрибуты из объекта datetime.