8 Stimmen

Python - Von der um die Sommerzeit bereinigten Ortszeit zu UTC

Eine bestimmte Bank hat Filialen in allen größeren Städten der Welt. Sie öffnen alle um 10:00 Uhr Ortszeit. Wenn sie in einer Zeitzone liegt, in der Sommerzeit gilt, folgt die lokale Öffnungszeit natürlich auch der an die Sommerzeit angepassten Zeit. Wie kann ich also von der Ortszeit auf die UTC-Zeit umstellen?

Was ich brauche, ist eine Funktion to_utc(localdt, tz) wie diese:

Argumente:

  • localdt: Ortszeit, als naives datetime-Objekt, um die Sommerzeit bereinigt
  • tz: Zeitzone im TZ-Format, z. B. 'Europa/Berlin'.

Rückgabe:

  • datetime-Objekt, in UTC, mit Berücksichtigung der Zeitzone

EDITAR:

Die größte Herausforderung besteht darin, zu erkennen, ob die Ortszeit in einen Zeitraum mit Sommerzeit fällt, was auch bedeutet, dass sie der Sommerzeit angepasst ist.

Für 'Europa/Berlin', das im Sommer +1 Sommerzeit hat:

  • 1. Januar 10:00 => 1. Januar 9:00 UTC
  • 1. Juli 10:00 => 1. Juli 8:00 UTC

Für 'Afrika/Lagos', das keine Sommerzeit hat:

  • 1. Januar 10:00 => 1. Januar 9:00 UTC
  • 1. Juli 10:00 => 1. Juli 9:00 UTC

9voto

unutbu Punkte 769083

Verwendung von pytz und insbesondere seine Lokalisierungsmethode :

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')))

ergibt

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

1voto

agf Punkte 159286
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())

Neue Version. Dies tut, was Sie wollen - nimmt eine naive Datumszeit und eine Zeitzone und gibt eine UTC-Datumszeit zurück.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X