2015-02-04 13 views
40

W Pythonie 3 można wygenerować datę ISO 8601 z .isoformat(), ale nie można przekonwertować ciągu utworzonego przez isoformat() z powrotem do obiekt datetime, ponieważ dyrektywy Pythona mają własną dyrektywę datetime. tj:% z = 0500 zamiast 05:00 (który jest produkowany przez .isoformat()). Na przykład:Jak przekonwertować ciąg python .isoformat() na obiekt datetime

>>> strDate = d.isoformat() 
>>> strDate 
'2015-02-04T20:55:08.914461+00:00' 

>>> objDate = datetime.strptime(strDate,"%Y-%m-%dT%H:%M:%S.%f%z") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python34\Lib\_strptime.py", line 500, in _strptime_datetime 
    tt, fraction = _strptime(data_string, format) 
    File "C:\Python34\Lib\_strptime.py", line 337, in _strptime 
    (data_string, format)) 
ValueError: time data '2015-02-04T20:55:08.914461+00:00' does not match format '%Y-%m-%dT%H:%M:%S.%f%z' 

Z dokumentacji strptime Pythona: (https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior)

% Z UTC przesunięcie w postaci + HHMM lub -HHMM (pusty ciąg jeżeli przedmiotem jest naiwny). (pusty), +0000, -0400, +1030

Krótko mówiąc, Python nawet nie stosuje się do własnych dyrektyw formatujących ciągi znaków.

Wiem, że datetime jest już straszne w Pythonie, ale to naprawdę wykracza poza nieuzasadnione w krainę zwykłej głupoty.

Powiedz mi, że to nie jest prawda.

+2

Czy rozważałeś usunięcie ostatniego dwukropka z isoformatowanego łańcucha, a następnie przeanalizowanie go z powrotem do obiektu datetime? To obejście, które można jeszcze zrobić nieco elegancko. –

+0

@OliverW. Rozważyłem to, w końcu skończyłem poddając się i instalując python-dateutil. W rzeczywistości nie uważam tego za dobre rozwiązanie. Myślę, że ci, którzy są odpowiedzialni za pythona, muszą przyjrzeć się temu, co zrobili z datetime. Odtąd już się poddałem i po prostu przeskoczę przez obręcze, jak wszyscy inni. –

+0

Zawsze byłem szczególnie pod wrażeniem Pythona dla funkcji HAVING takich jak strptime i strftime, nigdy nawet nie zauważyłem tego szczególnego niedoboru, ponieważ jak już wspomniano, można go raczej elegancko unikać. –

Odpowiedz

28

Jak się okazuje to jest obecny najlepsze "rozwiązanie" na to pytanie:

pip install python-dateutil 

potem ...

import datetime 
import dateutil.parser 

def getDateTimeFromISO8601String(s): 
    d = dateutil.parser.parse(s) 
    return d 
+53

Smutny stan datetime Pythona ... –

+1

Warto zauważyć, że jeśli czas twojego systemu jest ustawiony na UTC, strefa czasowa przetwarzanej daty będzie wynosić: tzlocal() ', które'! = tzutc' w porównaniach, zgodnie z tym linkiem: https://coderwall.com/p/dpauza/dateutil-parse-timezone –

+0

@DanieleVenzano Nie rozumiem tego. W jaki sposób ten łańcuch może wrócić w bardziej szczęśliwy sposób? – raratiru

10

Spróbuj tego:

>>> def gt(dt_str): 
...  dt, _, us= dt_str.partition(".") 
...  dt= datetime.datetime.strptime(dt, "%Y-%m-%dT%H:%M:%S") 
...  us= int(us.rstrip("Z"), 10) 
...  return dt + datetime.timedelta(microseconds=us) 

Zastosowanie:

>>> gt("2008-08-12T12:20:30.656234Z") 
datetime.datetime(2008, 8, 12, 12, 20, 30, 656234) 
+5

Twoje rozwiązanie nie rozwiązuje problemu, który został rozwiązany (i jest prawie powtórzeniem możliwego duplikatu, który był już połączony). W pierwotnym problemie OP zażądał skutecznego sposobu analizowania przesunięcia UTC, które zawiera dwukropek. –

+0

To rozwiązanie jest dobre, gdy instalowanie dodatkowej biblioteki jest dość niewygodne (np. W Google Appengine). – Luca

Powiązane problemy