Python - Откорректированное по летнему времени местное время до UTC - PullRequest
7 голосов
/ 23 июля 2011

Конкретный банк имеет филиалы во всех крупных городах мира.Все они открыты в 10:00 по местному времени.Если в пределах часового пояса, в котором используется летнее время, то, конечно, местное время открытия также следует за временем, отрегулированным по летнему времени.Итак, как мне перейти от местного времени к часу времени?

Мне нужна функция to_utc(localdt, tz), подобная этой:

Аргументы:

  • localdt: местное время, как наивный объект даты и времени, скорректированный по DST
  • tz: часовой пояс в формате TZ, например, 'Europe / Berlin'

Возвращает:

  • объект даты-времени, в UTC, с учетом часового пояса

РЕДАКТИРОВАТЬ:

Самая большая проблема состоит в том, чтобы определить, находится ли местное время в периоде с летним временем, что также означает, что оно настроено на летнее время.

Для «Европа / Берлин», где летом + 1 летнее время:

  • 1 января 10:00 => 1 января 9:00 UTC
  • июля1-е 10:00 => 1-ое июля 8:00 UTC

Для «Африка / Лагос», где нет летнего времени:

  • 1-е января 10:00 => 1-е января9:00 UTC
  • 1 июля 10:00 => 1 июля 9:00 UTC

Ответы [ 2 ]

8 голосов
/ 23 июля 2011

Использование pytz и, в частности, его метод локализации :

import pytz
import datetime as dt

def to_utc(localdt,tz):
    timezone=pytz.timezone(tz)
    utc=pytz.utc
    return timezone.localize(localdt).astimezone(utc)

if __name__=='__main__':
    for tz in ('Europe/Berlin','Africa/Lagos'):
        for date in (dt.datetime(2011,1,1,10,0,0),
                 dt.datetime(2011,7,1,10,0,0),
                 ):
            print('{tz:15} {l} --> {u}'.format(
                tz=tz,
                l=date.strftime('%b %d %H:%M'),
                u=to_utc(date,tz).strftime('%b %d %H:%M %Z')))

выход

Europe/Berlin   Jan 01 10:00 --> Jan 01 09:00 UTC
Europe/Berlin   Jul 01 10:00 --> Jul 01 08:00 UTC
Africa/Lagos    Jan 01 10:00 --> Jan 01 09:00 UTC
Africa/Lagos    Jul 01 10:00 --> Jul 01 09:00 UTC
1 голос
/ 23 июля 2011
from datetime import datetime, tzinfo, timedelta

class GMT1(tzinfo):
    def utcoffset(self, dt):
        return timedelta(hours=1)
    def dst(self, dt):
        return timedelta(0)
    def tzname(self,dt):
        return "Europe/Prague"
year, month, day = 2011, 7, 23
dt = datetime(year, month, day, 10)

class UTC(tzinfo):
    def utcoffset(self, dt):
        return timedelta(0)
    def dst(self, dt):
        return timedelta(0)
    def tzname(self,dt):
        return "UTC"

def utc(localt, tz):
    return localt.replace(tzinfo=tz).astimezone(UTC())

print utc(dt, GMT1())

Новая версия. Это делает то, что вы хотите - берет наивное время даты и часовой пояс и возвращает дату времени UTC.

...