2015-02-04 12 views
40

तो पायथन 3 में, आप आईएसओ 8601 दिनांक .isoformat() के साथ उत्पन्न कर सकते हैं, लेकिन आप isoformat() द्वारा बनाई गई स्ट्रिंग को किसी रूप में परिवर्तित नहीं कर सकते डेटाटाइम ऑब्जेक्ट क्योंकि पाइथन के डेटाटाइम निर्देश सही तरीके से मेल नहीं खाते हैं। यानी: 05:00 के बजाय% z = 0500 (जिसे .isoformat() द्वारा उत्पादित किया जाता है)। उदाहरण के लिए:पाइथन .isoformat() स्ट्रिंग को वापस डेटाटाइम ऑब्जेक्ट में परिवर्तित करने के लिए कैसे करें

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

पायथन के strptime प्रलेखन से: (https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior)

% z यूटीसी प्रपत्र + HHMM या -HHMM (रिक्त स्ट्रिंग यदि वस्तु अनुभवहीन है) में ऑफसेट। (खाली), +0000, -0400, +1030

तो, छोटे पायथन में भी अपने स्वयं के स्ट्रिंग स्वरूपण निर्देशों का पालन नहीं करता है।

मुझे पता है कि डेटटाइम पाइथन में पहले से ही भयानक है लेकिन यह वास्तव में सादे मूर्खता की भूमि में अनुचित होने से परे चला जाता है।

मुझे बताएं कि यह सच नहीं है।

+2

क्या आपने आइसोफॉर्मेटेड स्ट्रिंग से अंतिम कॉलन को अलग करने और फिर डेटाटाइम ऑब्जेक्ट पर वापस पार्स करने पर विचार किया है? यह एक कामकाज है, जो अभी भी कुछ हद तक सुंदरता से किया जा सकता है। –

+0

@ ओलिवर डब्ल्यू। मैंने इस पर विचार किया, अंत में मैं पाइथन-डेटुटिल देने और स्थापित करने में समाप्त हुआ। मैं वास्तव में यह एक अच्छा समाधान नहीं मानता हूं। मुझे लगता है कि जो लोग पाइथन के लिए ज़िम्मेदार हैं, उन्हें डेटाटाइम के साथ क्या किया है, इस पर नज़र डालने की जरूरत है। अभी तक मैंने छोड़ दिया है और बस हुप्स के माध्यम से कूद जाएगा जैसे हर कोई करता है। –

+0

मैं वास्तव में हमेशा विशेष रूप से पाइथन से प्रभावित हुआ हूं, जैसे कि स्ट्रैटाइम और स्ट्रैटाइम जैसे कार्यों को भी, मैंने कभी भी इस विशेष कमी को ध्यान में रखने के लिए समय नहीं लिया क्योंकि पहले से ही कहा गया है, इसे सुंदर ढंग से टाला जा सकता है। –

उत्तर

28

यह पता चला है के रूप में इस इस सवाल का वर्तमान सर्वश्रेष्ठ "समाधान" है:

pip install python-dateutil 

फिर ...

import datetime 
import dateutil.parser 

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

पाइथन के डेटाटाइम की दुखद स्थिति ... –

+1

यह ध्यान देने योग्य है कि यदि आपका सिस्टम का समय यूटीसी पर सेट है, तो पार्स की तारीख का समय क्षेत्र ' tzlocal() ', जो कि इस लिंक के मुताबिक तुलना में'! = tzutc' है: https://coderwall.com/p/dpauza/dateutil-parse-timezone –

+0

@DanieleVenzano मुझे यह नहीं मिला। यह स्ट्रिंग एक और अधिक खुश तरीके से वापस कैसे आ सकती है? – raratiru

10

इस प्रयास करें:

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

उपयोग:

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

आपका समाधान उस समस्या का समाधान नहीं करता है जो निर्धारित किया गया था (और संभवतः संभावित डुप्लिकेट की पुनरावृत्ति है जो पहले से ही जुड़ा हुआ था)। मूल समस्या में, ओपी ने यूटीसी ऑफसेट को पार्स करने के लिए एक प्रभावी तरीका मांगा है, जिसमें इसमें एक कोलन है। –

+0

यह समाधान अच्छा है जब भी एक अतिरिक्त लाइब्रेरी स्थापित करना कुछ असुविधाजनक होता है (उदाहरण के लिए Google Appengine पर) – Luca

संबंधित मुद्दे