Яндекс.Метрика

Рассылка обновлений по электронной почте

четверг, 27 декабря 2012 г.

Локализовать время и отбросить временную зону

Хомяк воодушевил меня написать пост. А сегодня хочу написать вам о том, как с помощью Питона из utc-времени получить «наивное» локальное время.

Ключевые слова для поиска: python to local naive time without timezone

Итак. Допустим у вас есть время now с временной зоной в UTC.

now
datetime.datetime(2012, 12, 27, 16, 1, 54, 784864, tzinfo=<DstTzInfo 'Europe/Moscow' MSK+4:00:00 STD>)

Из него можно легко получить timedelta-объект, содержащий разницу между UTC-временем и локальным.

offset = now.utcoffset()
datetime.timedelta(0, 14400)

14400 — это секунды, в часах, как известно, это +4.

Затем, нужно из времени now убрать информацию о зоне, чтобы получить «наивное» время (naive) и затем, прибавить offset.

now_without_timezone = now.replace(tzinfo = None)
datetime.datetime(2012, 12, 27, 16, 1, 54, 784864)

later_without_timezone = now_without_timezone + offset
datetime.datetime(2012, 12, 27, 20, 1, 54, 784864)

Конечно, все очень просто. Но все функции модулей datetime.datetime и pytz как-то сразу не укладываются в голове. Поэтому и полезна такая инструкция.

6 комментариев:

  1. выглядит как говнокод

    время независимо от таймзоны - это long, одинаковый во всех поясах. для того, чтобы вывести время для какой-либо тайм-зоны, должен использоваться форматтер, который сделает текстовое значение в зависимости от выбранного формата и зоны

    прибавляя offset ко времени, мы получаем время через 4 часа по UTC, а не время в 4-м часовом поясе

    ОтветитьУдалить
    Ответы
    1. Это не так. Мне понадобилось именно время без временной зоны и не в UTC. Так называемое naive time.

      Удалить
    2. а зачем оно бывает нужно?

      Удалить
    3. Matplotlib (питоновская библиотечка), например, не понимает время с зонами. Ему нужно обычное подавать. А график нужно было построить в местном времени.

      Удалить
    4. аа, понял, чтобы было совместимо с чужим говнокодом!

      Удалить