2009-07-10 11 views
14

Lassen Sie uns sagen, dass ich eine Variable t haben, die dieses Set:Wie drucke ich eine Python-Datetime in der lokalen Zeitzone?

datetime.datetime(2009, 7, 10, 18, 44, 59, 193982, tzinfo=<UTC>) 

Wenn ich str(t) sagen, bekomme ich:

'2009-07-10 18:44:59.193982+00:00' 

Wie kann ich eine ähnliche Zeichenfolge erhalten, außer in der lokalen Zeitzone gedruckt anstatt UTC?

+0

lokal wofür? –

+0

verwandt: [Wie konvertiert man eine Python-utc Datetime zu einem lokalen Datetime mit nur Python-Standard-Bibliothek?] (Http://Stackoverflow.com/a/13287083/4279) – jfs

Antwort

17

Denken Sie Ihre um aussehen sollte: datetime.astimezone()

http://docs.python.org/library/datetime.html#datetime.datetime.astimezone

Auch pytz Modul sehen - es ist ganz einfach zu bedienen - als Beispiel:

eastern = timezone('US/Eastern') 

http://pytz.sourceforge.net/

Beispiel:

from datetime import datetime 
import pytz 
from tzlocal import get_localzone # $ pip install tzlocal 

utc_dt = datetime(2009, 7, 10, 18, 44, 59, 193982, tzinfo=pytz.utc) 
print(utc_dt.astimezone(get_localzone())) # print local time 
# -> 2009-07-10 14:44:59.193982-04:00 
+12

So wie bekomme ich die aktuelle lokale Zeitzone? – mike

+0

ist nicht datetime.datetime (2009, 7, 10, 18, 44, 59, 193982) - was Sie brauchen? –

+10

Diese Antwort ist falsch. Ich lebe in England und in den USA/Eastern ist NICHT die ** lokale ** Zeitzone. – Philluminati

0

Ich schrieb so etwas wie diese neulich:

import time, datetime 
def nowString(): 
    # we want something like '2007-10-18 14:00+0100' 
    mytz="%+4.4d" % (time.timezone/-(60*60) * 100) # time.timezone counts westwards! 
    dt = datetime.datetime.now() 
    dts = dt.strftime('%Y-%m-%d %H:%M') # %Z (timezone) would be empty 
    nowstring="%s%s" % (dts,mytz) 
    return nowstring 

für Sie also den interessanten Teil ist wahrscheinlich die Zeile mit "mytz = ..." beginnen. time.timezone gibt die lokale Zeitzone zurück, allerdings mit umgekehrtem Vorzeichen im Vergleich zu UTC. So heißt es "-3600", um UTC + 1 auszudrücken.

Trotz seiner Unwissenheit in Bezug auf die Sommerzeit (DST, siehe Kommentar), lasse ich dies für Menschen herumspielen mit time.timezone.

+2

-1. Dies ergibt die Hälfte der Zeit ein falsches Ergebnis, wenn Sie sich in einer Zeitzone befinden, die DST verwendet. 'time.timezone' enthält den Offset zu UTC, der verwendet wird, wenn DST nicht aktiv ist, unabhängig davon, ob sie gerade aktiv ist. – Feuermurmel

10

Ich glaube, der beste Weg, dies zu tun, ist die LocalTimezone Klasse in der datetime.tzinfo Dokumentation definiert zu verwenden (zur http://docs.python.org/library/datetime.html#tzinfo-objects und scrollen Sie zum „Beispiel Tzinfo Klassen“ Abschnitt):

Local Unter der Annahme, ist eine Instanz von LocalTimezone

t = datetime.datetime(2009, 7, 10, 18, 44, 59, 193982, tzinfo=utc) 
local_t = t.astimezone(Local) 

dann str(local_t) gibt:

'2009-07-11 04:44:59.193982+10:00' 

was du willst.

(Anmerkung: das für Sie seltsam aussehen kann, weil ich in New South Wales, Australien bin, die 10 oder 11 Stunden voraus von UTC)

+1

Wenn Sie Local für die Datetime-Dokumentation definiert haben, funktioniert dies auch: 'str (datetime.datetime.now (tz = Local))' – hobs

+0

Beachten Sie, dass damit jede Verwendung mit dem aktuell gültigen UTC-Offset gedruckt wird. Das ist möglicherweise nicht das gleiche, das zum Zeitpunkt der "datetime" -Instanz (aufgrund von DST) gültig war oder sein wird. – Feuermurmel

+0

'LocalTimezone' kann für vergangene Daten fehlschlagen, wenn die zugrundeliegende 'time'-Implementierung keine historische Zeitzonendatenbank verwendet (Windows ist besonders in dieser Kategorie). – jfs

0

ich diese Funktion datetime_to_local_timezone() verwenden, die übermäßig gewundenen scheint aber ich fand keine einfachere Version einer Funktion, die eine datetime Instanz an der lokalen Zeitzone umwandelt, wie in dem Betriebssystem konfigurierte, mit der UTC-Offset, zu dieser Zeit in Kraft war:

import time, datetime 

def datetime_to_local_timezone(dt): 
    epoch = dt.timestamp() # Get POSIX timestamp of the specified datetime. 
    st_time = time.localtime(epoch) # Get struct_time for the timestamp. This will be created using the system's locale and it's time zone information. 
    tz = datetime.timezone(datetime.timedelta(seconds = st_time.tm_gmtoff)) # Create a timezone object with the computed offset in the struct_time. 

    return dt.astimezone(tz) # Move the datetime instance to the new time zone. 

utc = datetime.timezone(datetime.timedelta()) 
dt1 = datetime.datetime(2009, 7, 10, 18, 44, 59, 193982, utc) # DST was in effect 
dt2 = datetime.datetime(2009, 1, 10, 18, 44, 59, 193982, utc) # DST was not in effect 

print(dt1) 
print(datetime_to_local_timezone(dt1)) 

print(dt2) 
print(datetime_to_local_timezone(dt2)) 

In diesem Beispiel werden vier Daten gedruckt. Für zwei Zeitpunkte, jeweils einen im Januar und einen im Juli 2009, druckt er den Zeitstempel einmal in UTC und einmal in der lokalen Zeitzone.Hier, wo MEZ (UTC + 01: 00) im Winter und CEST verwendet (UTC + 02: 00) wird im Sommer verwendet, druckt es die folgenden:

2009-07-10 18:44:59.193982+00:00 
2009-07-10 20:44:59.193982+02:00 

2009-01-10 18:44:59.193982+00:00 
2009-01-10 19:44:59.193982+01:00 
+0

Sieht aus wie Python 3.3+ Code ('.timestamp()' Methode) In diesem Fall könnten Sie einen einfacheren Code verwenden: ['dt.astimezone (tz = None)'] (http://stackoverflow.com/a/ 13287083/4279). Verwenden Sie auch 'timezone.utc' anstelle von' timezone (datetime.timedelta()) '. – jfs

0

Ab Python 3.2, nur mit Standardbibliothek Funktionen:

u_tm = datetime.datetime.utcfromtimestamp(0) 
l_tm = datetime.datetime.fromtimestamp(0) 
l_tz = datetime.timezone(l_tm - u_tm) 

t = datetime.datetime(2009, 7, 10, 18, 44, 59, 193982, tzinfo=l_tz) 
str(t) 
'2009-07-10 18:44:59.193982-07:00' 

brauchen nur l_tm - u_tm oder u_tm - l_tm abhängig verwenden, ob Sie als + oder zeigen wollen - Stunden von UTC. Ich bin in MST, woher kommt das -07. Intelligenterer Code sollte in der Lage sein, herauszufinden, auf welche Weise er subtrahieren soll.

Und müssen nur die lokale Zeitzone einmal berechnen. Das wird sich nicht ändern. Zumindest bis Sie von/in die Sommerzeit wechseln.

Verwandte Themen