Подтвердить что ты не робот

Локализация 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, любая помощь приветствуется!

4b9b3361

Ответ 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.