Come si converte un time.struct_time
oggetto Python in un datetime.datetime
oggetto?
Ho una libreria che fornisce la prima e una seconda libreria che vuole la seconda.
Come si converte un time.struct_time
oggetto Python in un datetime.datetime
oggetto?
Ho una libreria che fornisce la prima e una seconda libreria che vuole la seconda.
Risposte:
Usa time.mktime () per convertire la tupla temporale (in localtime) in secondi dall'Epoca, quindi usa datetime.fromtimestamp () per ottenere l'oggetto datetime.
from datetime import datetime
from time import mktime
dt = datetime.fromtimestamp(mktime(struct))
tm_isdst
dati? Credo così, il risultante datetime oggetto rimane naive nella misura di tornare None
a .dst()
anche se struct.tm_isdst
è 1
.
mktime()
dovrebbe essere preso tm_isdst
in considerazione e Python time.mktime()
chiama la mktime()
funzione C su CPython. mktime()
può scegliere l'ora locale errata quando è ambigua (ad es. durante la transizione di fine DST ("fallback") se lo struct.tm_isdst
è -1
o se mktime()
sulla piattaforma data ignora l' input tm_isdst
. Inoltre, se il fuso orario locale aveva un offset utc diverso in passato e C mktime()
non utilizza un database tz storico in grado di fornire i vecchi valori di offset utc, mktime()
potrebbe anche restituire un valore errato (ad esempio di un'ora).
mktime()
non ignora tm_isdst
sulla piattaforma data (fa sulla mia) quindi fromtimestamp()
perde definitivamente le informazioni: l' oggetto ingenuo restituito datetime
che rappresenta l'ora locale può essere ambiguo (timestamp -> l'ora locale è deterministica (se ignoriamo i secondi bisestili) ma local time -> timestamp may be ambiguous e.g., during end-of-DST transition). Also,
fromtimestamp () `può scegliere un offset utc errato se non utilizza un database tz storico.
Come questo:
>>> structTime = time.localtime()
>>> datetime.datetime(*structTime[:6])
datetime.datetime(2009, 11, 8, 20, 32, 35)
*
e la **
sintassi ti consentono di espandere un oggetto di tipo listy o dicty in argomenti separati - è uno dei miei pezzi preferiti di adorazione di Python. Vedi docs.python.org/2/tutorial/… per maggiori informazioni
t=time.strptime("30 Jun 1997 22:59:60", "%d %b %Y %H:%M:%S"); datetime.datetime(*t[:6])
datetime
: datetime(*t[:5]+(min(t[5], 59),))
ad esempio, per accettare "2015-06-30 16:59:60 PDT"
.
Questa non è una risposta diretta alla tua domanda (a cui è già stata data una risposta abbastanza buona). Tuttavia, avendo avuto a volte mordermi più volte sul fondamento, non posso sottolineare abbastanza che ti sorprenderesti a guardare da vicino ciò che il tuo oggetto time.struct_time fornisce, rispetto a ciò che altri campi temporali potrebbero avere.
Supponendo che tu abbia sia un oggetto time.struct_time, sia un'altra stringa data / ora, confronta i due e assicurati di non perdere dati e di creare inavvertitamente un oggetto datetime ingenuo, quando puoi fare diversamente.
Ad esempio, l'eccellente modulo feedparser restituirà un campo "pubblicato" e potrebbe restituire un oggetto time.struct_time nel suo campo "publishing_parsed":
time.struct_time(tm_year=2013, tm_mon=9, tm_mday=9, tm_hour=23, tm_min=57, tm_sec=42, tm_wday=0, tm_yday=252, tm_isdst=0)
Ora nota cosa ottieni effettivamente con il campo "pubblicato".
Mon, 09 Sep 2013 19:57:42 -0400
Di Stallman 's Beard! Informazioni sul fuso orario!
In questo caso, l'uomo pigro potrebbe voler utilizzare l'eccellente modulo dateutil per conservare le informazioni sul fuso orario:
from dateutil import parser
dt = parser.parse(entry["published"])
print "published", entry["published"])
print "dt", dt
print "utcoffset", dt.utcoffset()
print "tzinfo", dt.tzinfo
print "dst", dt.dst()
che ci dà:
published Mon, 09 Sep 2013 19:57:42 -0400
dt 2013-09-09 19:57:42-04:00
utcoffset -1 day, 20:00:00
tzinfo tzoffset(None, -14400)
dst 0:00:00
Si potrebbe quindi utilizzare l'oggetto datetime sensibile al fuso orario per normalizzare tutto il tempo in UTC o qualunque cosa si pensi sia eccezionale.
*_parsed
campi da feedparsed sono già normalizzati in UTC, come può essere verificato nella documentazione di analisi della data, quindi è ridondante.
datetime
oggetto che viene perso quando feedparser
analizza le date delle stringhe non elaborate.