मैं अजगर में एक तारीख स्ट्रिंग प्रारूप को कैसे मान्य करूं?


143

मेरे पास एक अजगर विधि है जो एक तार के रूप में एक तिथि इनपुट को स्वीकार करती है

मैं यह सुनिश्चित करने के लिए एक सत्यापन कैसे जोड़ूँ कि दिनांक स्ट्रिंग को विधि में पास किया जा रहा है, ffg में है। प्रारूप:

'YYYY-MM-DD'

यदि यह नहीं है, तो विधि को किसी प्रकार की त्रुटि को उठाना चाहिए


2
यह अधिक पायथोनिक हो सकता है (माफी के लिए पूछें, अनुमति नहीं) बिल्कुल भी जांच न करें और होने वाले किसी भी अपवाद को पकड़ लें।
थॉमस

जवाबों:


230
>>> import datetime
>>> def validate(date_text):
    try:
        datetime.datetime.strptime(date_text, '%Y-%m-%d')
    except ValueError:
        raise ValueError("Incorrect data format, should be YYYY-MM-DD")


>>> validate('2003-12-23')
>>> validate('2003-12-32')

Traceback (most recent call last):
  File "<pyshell#20>", line 1, in <module>
    validate('2003-12-32')
  File "<pyshell#18>", line 5, in validate
    raise ValueError("Incorrect data format, should be YYYY-MM-DD")
ValueError: Incorrect data format, should be YYYY-MM-DD

8
क्या ऐसा करने का कोई तरीका है जो बिना किसी कोशिश के / को छोड़कर है? जब एक अपवाद को उठाया जाता है और पकड़ा जाता है तो पायथन काफी धीमा हो जाता है।
शिफा

1
@chiffa आप एक दिनांक प्रारूप regex से मेल खा सकते हैं, लेकिन इसकी अनुशंसा नहीं की गई है क्योंकि यह कम मजबूत है और अपवाद स्पष्ट हैं। क्या आपको यकीन है कि तारीख सत्यापन आपकी अड़चन है?
जामिलाक

1
वास्तव में नहीं, इसलिए अंत में मैं सिर्फ एक समारोह में फेंक-छोड़कर निर्माण को लपेटूंगा। मुझे बस आश्चर्य है कि कोई बूल-लौटने वाला सत्यापन कार्य नहीं है जो डेटाटाइम लाइफ लाइब्रेरी में एक्सेप्शन थ्रो को ट्रिगर करेगा।
शिफा

@chiffa हो सकता है कि इसमें शामिल न हों, उद्देश्य के लिए बूल रिटर्निंग वैरिफिकेशन फंक्शन शामिल हो, यह बाहरी पुस्तकालयों में मौजूद हो सकता है
जैमिलक

2
उन लोगों के लिए जो तारीखों में शून्य गद्दी चाहते हैं, यह समाधान काम नहीं करेगा क्योंकि शून्य गद्दी के बारे में सख्ती नहीं है। व्हॉट्सएप छीनने के बाद अपने स्वयं के एक रेक्स को लागू करें या परिणामी स्ट्रिंग की लंबाई की जांच करें और फिर इस समाधान का उपयोग करें।
सुपार्श्व २ Sup

65

अजगरdateutil पुस्तकालय (और अधिक) इस के लिए बनाया गया है। यह स्वचालित रूप से आपके लिए एक datetimeऑब्जेक्ट में परिवर्तित कर देगा और ValueErrorअगर यह नहीं कर सकता है तो बढ़ाएं ।

उदहारण के लिए:

>>> from dateutil.parser import parse
>>> parse("2003-09-25")
datetime.datetime(2003, 9, 25, 0, 0)

ValueErrorयदि तारीख सही ढंग से स्वरूपित नहीं की जाती है तो यह बढ़ जाता है:

>>> parse("2003-09-251")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/jacinda/envs/dod-backend-dev/lib/python2.7/site-packages/dateutil/parser.py", line 720, in parse
    return DEFAULTPARSER.parse(timestr, **kwargs)
  File "/Users/jacinda/envs/dod-backend-dev/lib/python2.7/site-packages/dateutil/parser.py", line 317, in parse
    ret = default.replace(**repl)
ValueError: day is out of range for month

dateutilभविष्य में अन्य स्वरूपों को पार्स करने की आवश्यकता होने पर भी यह अत्यंत उपयोगी है, क्योंकि यह अधिकांश ज्ञात स्वरूपों को समझदारी से संभाल सकता है और आपको अपने विनिर्देश को संशोधित करने की अनुमति देता है: dateutilउदाहरणों को पार्स करना

जरूरत पड़ने पर यह टाइमजोन को भी हैंडल करता है।

टिप्पणियों के आधार पर अपडेट करें : parseकीवर्ड तर्क को भी स्वीकार करता है dayfirstजो यह नियंत्रित करता है कि क्या दिन या महीने पहले आने की उम्मीद है अगर कोई तारीख अस्पष्ट है। यह असत्य की अवहेलना करता है। उदाहरण के लिए

>>> parse('11/12/2001')
>>> datetime.datetime(2001, 11, 12, 0, 0) # Nov 12
>>> parse('11/12/2001', dayfirst=True)
>>> datetime.datetime(2001, 12, 11, 0, 0) # Dec 11

1
यह बहुत अधिक उदाहरण के लिए स्वीकार कर सकता है, parse('13/12/2001')"13 दिसंबर" है, लेकिन parse('11/12/2001')"12 नवंबर" है (पहला परिणाम यहां "11 दिसंबर" का सुझाव देगा)।
jfs

2
parseवास्तव में एक dayfirstकीवर्ड तर्क लेता है जो आपको इसे नियंत्रित करने की अनुमति देता है। parse('11/12/2001', dayfirst=True)"11 दिसंबर को लौटेगा।" dateutil के डिफ़ॉल्ट हैdayfirst=False
Jacinda

आपको वह बिंदु याद आ रहा है जो datetutil.parser.parse()बहुत अधिक समय स्वरूपों को स्वीकार करता है (आप अस्पष्ट इनपुट के साथ अन्य उदाहरण पा सकते हैं)। यदि आप यह सत्यापित करना चाहते हैं कि आपका इनपुट YYYY-MM-DD प्रारूप में है तो parse()फ़ंक्शन गलत उपकरण है।
jfs

1
यह एक पूरी तरह से मान्य बिंदु है - यदि आप वास्तव में केवल उस विशिष्ट प्रारूप को प्रतिबंधित करना चाहते हैं जो ऐसा नहीं करता है, और स्वीकृत जवाब पहले से ही उस मामले में सही काम करने का एक बड़ा काम करता है। मुझे लगता है कि जब मैंने उत्तर लिखा था, तो मैं यह इंगित करने की पंक्तियों के साथ अधिक सोच रहा था कि यह कैसे मान्य किया जाए कि क्या यह उस विशेष प्रारूप के विपरीत एक वैध तारीख थी जो लेखक ने अनुरोध किया था, जब लोग इस सवाल पर आते हैं कि वे अक्सर क्या करते हैं की तलाश में
Jacinda

क्या ऑब्जेक्ट के .parse()अलावा प्रारूप स्ट्रिंग को वापस लाने का कोई तरीका है datetime?
नगरनाराम

35

मुझे लगता है कि पूर्ण मान्य फ़ंक्शन को इस तरह दिखना चाहिए:

from datetime import datetime

def validate(date_text):
    try:
        if date_text != datetime.strptime(date_text, "%Y-%m-%d").strftime('%Y-%m-%d'):
            raise ValueError
        return True
    except ValueError:
        return False

सिर्फ एक्साइटिंग

datetime.strptime(date_text, "%Y-%m-%d") 

पर्याप्त नहीं है क्योंकि स्ट्रैप्टाइम विधि उस महीने की जांच नहीं करती है और महीने का दिन शून्य-गद्देदार दशमलव संख्याएं हैं। उदाहरण के लिए

datetime.strptime("2016-5-3", '%Y-%m-%d')

त्रुटियों के बिना निष्पादित किया जाएगा।


3
"आप तकनीकी रूप से सही हैं - सबसे सही तरह का।" मुझे अपने तार में यह सुनिश्चित करने की आवश्यकता थी।
डेलरोको

यह मेरे परीक्षणों के खिलाफ ठीक काम करता है, हालांकि मुझे लगता है कि दस्तावेज गलत है क्योंकि यह बताता है: "% d -> महीने का दिन शून्य-गद्देदार दशमलव संख्या के रूप में -> 01, 02,…, 31" और% m के लिए समान है -> शून्य-गद्देदार दशमलव संख्या के रूप में महीना। -> 01, 02,…, 12 docs.python.org/2/library/…
thanos.a

यदि आपको यह जाँचने की आवश्यकता है कि महीने और दिन शून्य-गद्देदार हैं, तो क्या यह केवल स्ट्रिंग की लंबाई की जाँच करने के लिए पर्याप्त नहीं होगा और datetime.strptime(date_text, "%Y-%m-%d")?
काइल बैरन

17
from datetime import datetime

datetime.strptime(date_string, "%Y-%m-%d")

ValueErrorअगर यह एक असंगत प्रारूप प्राप्त करता है तो यह उठता है ।

.. यदि आप दिनांक और समय के साथ बहुत कुछ कर रहे हैं (डेटाटाइम ऑब्जेक्ट्स के अर्थ में, यूनिक्स टाइमस्टैम्प फ़्लोट्स के विपरीत), तो यह पाइट्ज़ मॉड्यूल में देखने के लिए एक अच्छा विचार है, और भंडारण / डीबी के लिए, यूटीसी में सब कुछ स्टोर करें ।


2
आप और तेज़ थे, मैंने इसे खुद ( ideone.com/vuxDDf ) पोस्ट किया होगा । वोट दें।
टाडेक

.. अन्याय ने इसे पोस्ट किए जाने के ठीक बाद देखा, और ऐसा होता है कि आज डेटटाइम ऑब्जेक्ट्स के साथ काम कर रहा है।
श्री बी।

-7

यह सबसे आसान तरीका है:

date = datetime.now()
date = date.strftime('%Y-%m-%d_%H-%M-%S.jpg')

2
केवल कोड के बजाय स्पष्टीकरण देना बेहतर होगा।
लुकास_ओ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.