2016-05-31 17 views
0

In meiner Django-App habe ich ein Datetime-Objekt, das ich serialisieren und dann deserialisieren muss. Wenn ich es versuche, erhalte ich die Fehlermeldung:Serialisieren und Deserialisieren von Datetimefield-Objekt (Django-App)

ValueError: time data '2016-05-31T18:57:17.280939+00:00' does not match format '%Y-%m-%d %H:%M:%S.%f'

Mein Code zu serialisieren und deserialisieren ist:

timestring = time.isoformat() #where timestring is DateTimeField type object, instantiated in Django 

timeobj = datetime.strptime(timestring, "%Y-%m-%d %H:%M:%S.%f") 

Was mache ich falsch und wie komme ich über den Berg? Ihre Anleitung wird sehr geschätzt.

+0

versuchen 'python-dateutil' verwenden,' dateutil.parser.parse' speziell ... das Problem Datetime ist nicht bekannt, Zeitzone Standardmäßig (Pytz kann ein wenig helfen) .. aber die + 00: 00 ist was es bricht ... dateutil sollte dies richtig behandeln ... –

+0

alternativ könnte man wahrscheinlich 'timeobj = datetime.strptime (timestring,"% Y -% m-% dT% H:% M:% S.% f + 00: 00 ")' wenn es immer +00: 00 –

+0

@JoranBeasley: Yea versuchte, shortc ut (es ist immer +00: 00), aber immer noch: 'ValueError: Zeitdaten '2016-05-31T19: 10: 26.083572 + 00: 00' stimmt nicht mit dem Format '% Y-% m-% d% H überein: % M:% S.% f + 00: 00'' –

Antwort

1

timeobj = datetime.strptime(timestring, "%Y-%m-%dT%H:%M:%S.%f+00:00")

(fügt ein T als Datum/Zeit-Separator und Fest-Codes wird der Zeichenfolge Teil Offset UTC)

wird Ihr Problem lösen ... und ich denke, seine ziemlich sicher ... persönlich ich gehe immer mit

from dateutil.parser import parse as date_parse 
dt_obj = date_parse(timestring) 

, dass so ziemlich immer funktioniert und erfordert mir nicht die Datumszeichen hart codieren Sie benötigen pip install python-dateutil

0

So gibt es zwei Dinge, die sich hier:

  1. Ihr Format-String hat einen Raum zwischen %d und %H aber der Test-String hat eine T.

  2. Pythons datetime.datetime.strptime funktioniert nicht mit Zeitzone Namen/Offsets. Von der relevant docs:

classmethod datetime.strptime(date_string, format) 

Return a datetime corresponding to date_string, parsed according to format. This is equivalent to datetime(*(time.strptime(date_string, format)[0:6])).

So können Sie year, month, day, extrahieren hour, minute, second und microsecond aber die %z Richtlinie ist für strftime nur, nicht strptime.

So in der Zusammenfassung:

In [18]: datetime.strptime(datetime.today().isoformat(), '%Y-%m-%dT%H:%M:%S.%f') 
Out[18]: datetime.datetime(2016, 5, 31, 15, 20, 20, 581261) 

aber

In [22]: datetime.strptime(datetime.today().isoformat()+'+00:00', '%Y-%m-%dT%H:%M:%S.%f%z') 
--------------------------------------------------------------------------- 
ValueError: 'z' is a bad directive in format '%Y-%m-%dT%H:%M:%S.%f%z' 
Verwandte Themen