পাইথনে আমি কীভাবে তারিখের স্ট্রিং ফর্ম্যাটটিকে বৈধতা দেব?


143

আমার কাছে পাইথন পদ্ধতি রয়েছে যা গ্রহণ করে একটি তারিখ ইনপুটটিকে স্ট্রিং হিসাবে

পদ্ধতিতে পাসের তারিখের স্ট্রিংটি এফএফজি-তে রয়েছে তা নিশ্চিত করার জন্য আমি কীভাবে একটি বৈধতা যুক্ত করব। বিন্যাস:

'YYYY-MM-DD'

যদি এটি না হয়, পদ্ধতিটি কোনও ধরণের ত্রুটি বাড়াতে হবে


2
এটিকে আরও পরীক্ষা না করা আরও পাইথোনিক (ক্ষমার জন্য জিজ্ঞাসা করুন, অনুমতি চেয়ে নয়) হতে পারে এবং ফলস্বরূপ যে কোনও ব্যতিক্রম ঘটে যা ধরা দেয় catch
টমাস

উত্তর:


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
@ চিফা আপনি একটি তারিখের ফর্ম্যাট রেজেক্সের সাথে মিল রাখতে পারেন তবে এটি প্রস্তাবিত নয় কারণ এটি কম শক্তিশালী এবং ব্যতিক্রমগুলি আরও পরিষ্কার। আপনি কি নিশ্চিত যে তারিখের বৈধতা আপনার বাধা?
জামিলাক

1
আসলেই নয়, তাই শেষ পর্যন্ত আমি কেবল কোনও ফাংশনে কন্সট্রাক্ট বাদ দিয়ে নিক্ষেপ করব। আমি কেবল অবাক হয়েছি যে কোনও বিল-রিটার্নিং বৈধকরণের ফাংশন নেই যা ডেটটাইম লাইব্রেরিতে ব্যতিক্রম থ্রোকে ট্রিগার করবে।
শিফায়

@ শিফা হয়ত তাদের উদ্দেশ্য অনুসারে বুল রিটার্নিং বৈধতা ফাংশন অন্তর্ভুক্ত না, এটি বাহ্যিক গ্রন্থাগারে উপস্থিত থাকতে পারে
জামিলাক

2
যারা তারিখগুলিতে শূন্য প্যাডিং চান তাদের জন্য, এই সমাধানটি শূন্য প্যাডিং সম্পর্কে কঠোর নয় বলে স্ট্র্যাপটাইম কাজ করবে না। আপনার নিজের একটি রেজেক্স প্রয়োগ করুন বা সাদা স্ফুটটি বাদ দেওয়ার পরে ফলাফলের স্ট্রিংয়ের দৈর্ঘ্য পরীক্ষা করুন এবং তারপরে এই সমাধানটি ব্যবহার করুন।
সুপরিশ্বা

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')"১৩ ডিসেম্বর" তবে 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
এটি একটি সম্পূর্ণ বৈধ পয়েন্ট - আপনি যদি সত্যিই কেবল নির্দিষ্ট নির্দিষ্ট বিন্যাসে সীমাবদ্ধ রাখতে চান তবে এটি তা করে না, এবং গৃহীত উত্তর ইতিমধ্যে সেই ক্ষেত্রে সঠিক কাজ করার জন্য দুর্দান্ত কাজ করে। আমি মনে করি আমি যখন উত্তরটি লিখলাম তখন লেখক যে অনুরোধ করেছিলেন সেই নির্দিষ্ট বিন্যাসের বিপরীতে এটি বৈধ তারিখ কিনা তা কীভাবে যাচাই করা যায় তা কীভাবে যাচাই করা যায় তা নির্দেশ করার পংক্তিতে আমি আরও চিন্তাভাবনা করছিলাম, যখন লোকেরা এই প্রশ্নটি আসে তখন তারা প্রায়শই কী হয় খুঁজছি.
জ্যাকিন্দা

অবজেক্টের .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
"আপনি প্রযুক্তিগতভাবে সঠিক - সর্বোত্তম ধরণের সঠিক" " আমার স্ট্রিংগুলিতে এটি নিশ্চিত করা দরকার।
delrocco

এটি আমার পরীক্ষাগুলির বিরুদ্ধে দুর্দান্ত কাজ করে, তবে আমি ডকুমেন্টেশনটি ভুল বলে মনে করি যেমন বলা হয়েছে: "% d -> মাসের দিনটি শূন্য প্যাডযুক্ত দশমিক সংখ্যা হিসাবে -> 01, 02,…, 31" এবং% মিটারের জন্য একই -> শূন্য-প্যাডযুক্ত দশমিক সংখ্যা হিসাবে মাস। -> 01, 02,…, 12 ডকস.পিথন.আর.থ
থানস.এ

আপনার যদি সেই মাস এবং দিনটি শূন্য প্যাডযুক্ত রয়েছে কিনা তা খতিয়ে দেখার দরকার হয়, কেবল স্ট্রিংয়ের দৈর্ঘ্য পরীক্ষা করা কি যথেষ্ট হবে না এবং 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
কেবল কোডের পরিবর্তে ব্যাখ্যা দেওয়া ভাল হবে।
lukas_o
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.