2009-07-10 17 views
14

Diciamo che ho una variabile t che è impostato a questo:Come si stampa un datetime Python nel fuso orario locale?

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

Se dico str(t), ottengo:

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

Come posso ottenere una stringa simile, tranne stampati nel fuso orario locale piuttosto che UTC?

+0

locale per cosa? –

+0

correlati: [Come convertire un python utc datetime in un datetime locale utilizzando solo la libreria standard python?] (Http://stackoverflow.com/a/13287083/4279) – jfs

risposta

17

pensate che il vostro dovrebbe guardarsi intorno: datetime.astimezone()

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

vedi anche modulo pytz - è abbastanza facile da usare - come ad esempio:

eastern = timezone('US/Eastern') 

http://pytz.sourceforge.net/

Esempio:

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

Quindi, come ottengo il fuso orario locale corrente? – mike

+0

non è datetime.datetime (2009, 7, 10, 18, 44, 59, 193982): cosa ti serve? –

+10

Questa risposta è sbagliata. Io vivo in Inghilterra e USA/Est NON è il fuso orario ** locale **. – Philluminati

0

ho scritto qualcosa di simile l'altro giorno:

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 

Così la parte interessante per voi è probabilmente la linea che inizia con "mytz = ...". time.timezone restituisce il fuso orario locale, anche se con segno opposto rispetto a UTC. Quindi dice "-3600" per esprimere UTC + 1.

Nonostante la sua ignoranza verso l'ora legale (ora legale, vedere il commento), lo lascio a persone che armeggiano con time.timezone.

+2

-1. Ciò restituirà un risultato errato metà del tempo, se ti trovi in ​​un fuso orario che utilizza l'ora legale. 'time.timezone' contiene l'offset di UTC che viene utilizzato quando l'ora legale non è in vigore, indipendentemente dal fatto che sia attualmente in vigore. – Feuermurmel

10

Credo che il modo migliore per farlo è quello di utilizzare la classe LocalTimezone definito nella documentazione datetime.tzinfo (goto http://docs.python.org/library/datetime.html#tzinfo-objects e scorrere fino alla "Esempio tzinfo classi" sezione):

Supponendo Local è un'istanza di LocalTimezone

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

poi str(local_t) dà:

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

che è quello che vuoi.

(Nota: questo può sembrare strano per voi, perché io sono in Nuovo Galles del Sud, Australia, che è di 10 o 11 ore avanti di UTC)

+1

Se hai definito Locale per i documenti datetime, funziona anche: 'str (datetime.datetime.now (tz = Local))' – hobs

+0

Tieni presente che questo stamperà qualsiasi utilizzo con lo scostamento UTC attualmente in vigore, che potrebbe non essere lo stesso che era o sarà in vigore al momento dato dall'istanza 'datetime' (dovuta a DST). – Feuermurmel

+0

'LocalTimezone' potrebbe non riuscire per le date passate se l'implementazione' time' non utilizza un database storico fuso orario (Windows è in particolare in questa categoria). – jfs

0

Io uso questa funzione datetime_to_local_timezone(), che sembra eccessivamente contorto ma non ho trovato nessuna versione più semplice di una funzione che converte un'istanza datetime per il fuso orario locale, come configurato nel sistema operativo , con l'UTC compensato che era in vigore in quel momento :

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

Questo esempio stampa quattro date. Per due momenti nel tempo, uno a gennaio e uno a luglio 2009, ciascuno stampa il timestamp una volta in UTC e una volta nel fuso orario locale.Qui, dove CET (GMT + 01: 00) è utilizzato nel CEST inverno e (GMT + 02: 00) è utilizzato nel periodo estivo, si stampa il seguente:

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

Sembra codice Python 3.3+ (metodo '.timestamp()') In questo caso è possibile utilizzare un codice più semplice: ['dt.astimezone (tz = None)'] (http://stackoverflow.com/a/ 13287083/4279). Utilizza anche 'timezone.utc' invece di' timezone (datetime.timedelta()) '. – jfs

0

Come di python 3.2, utilizzando solo funzioni della libreria standard:

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' 

solo bisogno di utilizzare l_tm - u_tm o u_tm - l_tm a seconda se si desidera mostrare come + o - ore da UTC. Sono in MST, da dove proviene il -07. Il codice più intelligente dovrebbe essere in grado di capire in che modo sottrarre.

E solo una volta è necessario calcolare il fuso orario locale. Questo non cambierà. Almeno fino a quando non si passa da/a ora legale.

Problemi correlati