2016-09-16 7 views
10

मुझे दिए गए प्रारूप में, 2014-01-02 की तिथि "20140102" द्वारा प्रदर्शित की जाएगी। यह सही ढंग से मानक strptime साथ पार्स किया गया है:पायथन का डेटाटाइम.datetime.strptime ('201412', '% Y% m% d') क्यों ValueError नहीं बढ़ाता है?

>>> datetime.datetime.strptime("20140102", "%Y%m%d") 
datetime.datetime(2014, 1, 2, 0, 0) 

इस प्रारूप में, "201,412" नहीं कोई मान्य दिनांक होगा। docs कहता है कि "% m" निर्देश "शून्य-गद्देदार दशमलव संख्या के रूप में महीना" है। यह उदाहरण "01, 02, ..., 12" के रूप में देता है। दिन निर्देश "% d" को भी शून्य-गद्दे माना जाता है।

इस पर आधारित, मुझे उम्मीद थी कि "201412" इस प्रारूप के साथ एक अवैध इनपुट होगा, इसलिए वैल्यूएरर बढ़ाएगा।

>>> datetime.datetime.strptime("201412", "%Y%m%d") 
datetime.datetime(2014, 1, 2, 0, 0) 

सवाल यह है:: वहाँ निर्दिष्ट करने के लिए एक तरह से "कोई गंभीरता से केवल शून्य गद्देदार" है इसके बजाय, यह 2014-01-02 के रूप में व्याख्या की जाती है? या क्या मैं इस संदर्भ में "शून्य-गद्देदार" शब्द को गलत समझ रहा हूं?

ध्यान दें कि प्रश्न इस प्रारूप में तिथियों को पार्स करने के बारे में नहीं है, लेकिन स्ट्रिपटाइम के व्यवहार को समझने के बारे में नहीं है।

+0

यह वास्तव में आपकी मदद नहीं है, लेकिन यह कुछ हद तक संबंधित है (लगता है '/' अलग क्षेत्रों) [पार्स अजगर में गैर शून्य गद्देदार टाइमस्टैम्प] (http://stackoverflow.com/ प्रश्न/25279 993/पार्सिंग-गैर-शून्य-पैड-टाइमस्टैम्प-इन-पायथन) – metatoaster

+0

मुझे लगता है कि यह नियमित अभिव्यक्ति पर निर्भर करता है कि फ़ंक्शन – kiviak

+0

का उपयोग करता है जैसे कि पाइथन दस्तावेज़ों में कुछ अतिरिक्त स्पष्टीकरण अच्छा होगा। क्या यह गारंटी है कि 'strptime ("2014123", "% Y% m% d") हमेशा 'डेटाटाइम (2014, 12, 3, 0, 0)' देगी या यह' डेटाटाइम (2014, 1, 23, 0, 0) '? – Matthias

उत्तर

5
संबंधित issue अजगर ट्रैकर पर के अनुसार

, उदाहरण के इस तरह की तरह होने के साथ (इस सवाल का एक संशोधन का एक सा है, तथापि अवधारणा सटीक एक ही है):

>>> datetime.datetime.strptime('20141110', '%Y%m%d').isoformat() 
'2014-11-10T00:00:00' 
>>> datetime.datetime.strptime('20141110', '%Y%m%d%H%M').isoformat() 
'2014-01-01T01:00:00' 

ऊपर व्यवहार है this comment द्वारा समझाया गया एक बग है जो बताता है कि वे OpenGroup strptime standard के अनुरूप हैं जो निर्दिष्ट करता है कि "प्रमुख शून्य की अनुमति है लेकिन आवश्यक नहीं है।"

मुझे लगता है कि वर्कअराउंड रेगेक्स का उपयोग करना है या जांचें कि strptime में जाने से पहले स्ट्रिंग की लंबाई लंबाई 8 है।

6

आप कैसे regex के लिए %mhttps://github.com/python/cpython/blob/2d264235f6e066611b412f7c2e1603866e0f7f1b/Lib/_strptime.py#L204

'm': r"(?P<m>1[0-2]|0[1-9]|[1-9])"

परिभाषित किया गया है पर यहाँ देखें, तो आप या तो आप एक 10-12, 01-09, या 1-9 के रूप में स्वीकार्य महीने हो सकता है देख सकते हैं।

1

यह बहुत मुश्किल है, लेकिन ऐसा लगता है कि strptime बस जितना संभव हो सके स्ट्रिंग से मिलान करने का प्रयास करता है। पायथन के strptime सी strptime रूप में ही है, और डॉक्स का कहना है कि गद्दी वैकल्पिक है:

महीने संख्या [1,12] है; अग्रणी शून्य की अनुमति है लेकिन आवश्यक नहीं है।

http://pubs.opengroup.org/onlinepubs/7908799/xsh/strptime.html

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