Установка временной метки в Python w/ timezonedb.com

У меня есть приложение, которое использует timezonedb для получения информации о местном часовом поясе при создании нового сообщения, но я не уверен в математике для того, чтобы новые сообщения отражали часовой пояс, в котором я нахожусь. Например, я нахожусь в Южной Африке, разместил обновление на своем сервере (который использует время UTC), а дата/время в сообщении указывает PST. Я был бы рад помощи с кодом, так как, возможно, я просто плохо разбираюсь в математике.

В это время UTC: Wed Jan 26 05:33:09 UTC 2022 Я сделал пост с информацией из timestampdb:

timestamp: 1643182360
dst: 0
offset: 7200 

Сообщение появилось в моем приложении вчера в 09:33 вечера (здесь было 7:33 утра). Обычно я нахожусь в Калифорнии, поэтому я не уверен, могу ли я что-то сделать, чтобы исправить это.

В моем приложении настроек Django я использую "TIME_ZONE = US/Pacific" и "USE_TZ = True"

По моему мнению:

def post(self, request, *args, **kwargs):
    if data['timestamp'] != '':
        offset = data['tz_offset']
        timestamp = data['timestamp']
        if timestamp != '' and offset != '':
            if int(offset) < 0:
                timestamp = int(data['timestamp']) + abs(int(offset))
            else:
                timestamp = int(data['timestamp']) - abs(int(offset))
        naive_time = datetime.datetime.fromtimestamp(int(timestamp))
        localtz = pytz.timezone(data['tz_location'])
        aware_est = localtz.localize(naive_time)
        utc = aware_est.astimezone(pytz.utc)
        data['timestamp'] = pytz.timezone(data['tz_location']).localize(
            naive_time, is_dst=data['tz_dst'])
    else:
        data['timestamp'] = datetime.datetime.now()

Является ли это проблемой, которую я могу исправить с помощью моего settings.py или это проблема с моими представлениями?

Несколько вещей:

  • 1643182360 == 2022-01-26T07:32:40Z. Z означает UTC, а временные метки Unix всегда находятся в терминах UTC. Таким образом, ваша входная временная метка сдвигается преждевременно. Не пытайтесь корректировать временную метку с учетом часового пояса при ее сохранении - сохраняйте только время UTC.

  • Вы делаете слишком много математических вычислений. В общем, каждый раз, когда вы обнаруживаете, что прибавляете или вычитаете смещение от временной метки, вы, вероятно, выбираете различную точку во времени - а не корректируете часовой пояс. Ничего из этой математики там быть не должно.

  • Немного неясно, какие данные вы публикуете на каком этапе и как/почему вы используете timezonedb.com. Вы показываете tz_location в коде, но не в данных.

  • Если у вас действительно есть идентификатор часового пояса, вам вообще не нужно ни смещение, ни флаг DST. Просто конвертируйте из UTC непосредственно в этот часовой пояс. Пусть pytz (или dateutil, arrow или встроенный zoneinfo в Python 3.9+) сделает всю работу за вас.

    .
Вернуться на верх