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

Как использовать часовые пояса с объектом datetime в python?

Как правильно представить другой часовой пояс в моем часовом поясе? Следующий пример работает только потому, что я знаю, что EDT на один час впереди, поэтому я могу расколоть вычитание myTimeZone()

import datetime, re
from datetime import tzinfo

class myTimeZone(tzinfo):
    """docstring for myTimeZone"""
    def utfoffset(self, dt):
        return timedelta(hours=1)

def myDateHandler(aDateString):
    """u'Sat,  6 Sep 2008 21:16:33 EDT'"""
    _my_date_pattern = re.compile(r'\w+\,\s+(\d+)\s+(\w+)\s+(\d+)\s+(\d+)\:(\d+)\:(\d+)')
    day, month, year, hour, minute, second = _my_date_pattern.search(aDateString).groups()
    month = [
            'JAN', 'FEB', 'MAR', 
            'APR', 'MAY', 'JUN', 
            'JUL', 'AUG', 'SEP', 
            'OCT', 'NOV', 'DEC'
    ].index(month.upper()) + 1
    dt = datetime.datetime(
        int(year), int(month), int(day), 
        int(hour), int(minute), int(second)
    )                   
    # dt = dt - datetime.timedelta(hours=1)
    # dt = dt - dt.tzinfo.utfoffset(myTimeZone())
    return (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, 0, 0, 0)

def main():
    print myDateHandler("Sat,  6 Sep 2008 21:16:33 EDT")

if __name__ == '__main__':
    main()
4b9b3361

Ответ 1

Я рекомендую babel и pytz при работе с часовыми поясами. Храните свои внутренние объекты datetime наивно и в UTC и конвертируйте их в свой часовой пояс только для форматирования. Причина, по которой вам, вероятно, нужны наивные объекты (объекты без информации о часовом поясе), заключается в том, что многие библиотеки и адаптеры баз данных не имеют представления о часовых поясах.

Ответ 2

Стандартная библиотека Python не содержит информацию о часовом поясе, потому что к сожалению данные о часовом поясе изменяются намного быстрее, чем Python. Для этого нужен сторонний модуль; обычный выбор pytz

Ответ 3

Для текущего локального часового пояса вы можете использовать:

>>> import time
>>> offset = time.timezone if (time.localtime().tm_isdst == 0) else time.altzone
>>> offset / 60 / 60 * -1
-9

Возвращаемое значение находится в секундах к западу от UTC (с областями к востоку от UTC, получающим отрицательное значение). Это противоположно тому, как нам это действительно нравится, следовательно * -1.

localtime().tm_isdst будет равен нулю, если летнее сбережение в настоящее время не действует (хотя это может быть неверным, если область недавно изменила свой закон о летнем свете).

Ответ 4

Мы знаем, что часовой пояс отключен от GMT (сейчас UTC), но Python отключает часовой пояс от западного. Полагаю, что в Python есть отрицательное ограничение по часовому поясу.