WHY: दिनांक ऑब्जेक्ट हैं
पायथन में, तिथियां ऑब्जेक्ट हैं। इसलिए, जब आप उन्हें हेरफेर करते हैं, तो आप वस्तुओं में हेरफेर करते हैं, तार नहीं, टाइमस्टैम्प नहीं और न ही कुछ भी।
पायथन में किसी भी वस्तु का दो स्ट्रिंग प्रतिनिधित्व है:
नियमित रूप से प्रतिनिधित्व जो "प्रिंट" द्वारा उपयोग किया जाता है, str()
फ़ंक्शन का उपयोग करके प्राप्त किया जा सकता है। यह उस समय का सबसे आम मानव पठनीय प्रारूप है और इसका उपयोग प्रदर्शन को आसान बनाने के लिए किया जाता है। तो str(datetime.datetime(2008, 11, 22, 19, 53, 42))
आपको देता है '2008-11-22 19:53:42'
।
वैकल्पिक प्रतिनिधित्व जिसका उपयोग वस्तु प्रकृति (एक डेटा के रूप में) का प्रतिनिधित्व करने के लिए किया जाता है। यह repr()
फ़ंक्शन का उपयोग करके प्राप्त किया जा सकता है और यह जानना आसान है कि आपके द्वारा विकसित या डीबग करते समय किस तरह का डेटा हेरफेर करता है। repr(datetime.datetime(2008, 11, 22, 19, 53, 42))
आपको देता है 'datetime.datetime(2008, 11, 22, 19, 53, 42)'
।
क्या हुआ कि जब आपने "प्रिंट" का उपयोग करके तारीख मुद्रित की है, str()
तो इसका उपयोग किया गया ताकि आप एक अच्छी तारीख स्ट्रिंग देख सकें। लेकिन जब आपने प्रिंट किया है mylist
, तो आपने वस्तुओं की एक सूची मुद्रित की है और अजगर ने डेटा के सेट का उपयोग करने का प्रयास किया है repr()
।
कैसे: आप उसके साथ क्या करना चाहते हैं?
ठीक है, जब आप तारीखों में हेरफेर करते हैं, तो पूरे दिन तारीख वस्तुओं का उपयोग करते रहें। उन्हें उपयोगी तरीकों के हजार मिले और अधिकांश पायथन एपीआई को उम्मीद है कि तारीखें वस्तुएं होंगी।
जब आप उन्हें प्रदर्शित करना चाहते हैं, तो बस उपयोग करें str()
। पायथन में, अच्छा अभ्यास स्पष्ट रूप से सब कुछ डालना है। तो बस जब प्रिंट करने का समय हो, तो अपनी तारीख का एक स्ट्रिंग प्रतिनिधित्व प्राप्त करें str(date)
।
एक अंतिम बात। जब आपने तिथियों को प्रिंट करने का प्रयास किया, तो आपने मुद्रित किया mylist
। यदि आप एक तारीख प्रिंट करना चाहते हैं, तो आपको तारीख वस्तुओं को प्रिंट करना होगा, न कि उनके कंटेनर (सूची) को।
ईजी, आप एक सूची में सभी तारीख प्रिंट करना चाहते हैं:
for date in mylist :
print str(date)
ध्यान दें कि उस विशिष्ट मामले में , आप इसे छोड़ भी सकते हैं str()
क्योंकि प्रिंट आपके लिए इसका उपयोग करेगा। लेकिन यह एक आदत नहीं बननी चाहिए :-)
अपने कोड का उपयोग करके व्यावहारिक मामला
import datetime
mylist = []
today = datetime.date.today()
mylist.append(today)
print mylist[0] # print the date object, not the container ;-)
2008-11-22
# It's better to always use str() because :
print "This is a new day : ", mylist[0] # will work
>>> This is a new day : 2008-11-22
print "This is a new day : " + mylist[0] # will crash
>>> cannot concatenate 'str' and 'datetime.date' objects
print "This is a new day : " + str(mylist[0])
>>> This is a new day : 2008-11-22
उन्नत दिनांक स्वरूपण
तिथियों में एक डिफ़ॉल्ट प्रतिनिधित्व होता है, लेकिन आप उन्हें एक विशिष्ट प्रारूप में मुद्रित करना चाह सकते हैं। उस स्थिति में, आप strftime()
विधि का उपयोग करके एक कस्टम स्ट्रिंग प्रतिनिधित्व प्राप्त कर सकते हैं ।
strftime()
एक स्ट्रिंग पैटर्न की व्याख्या करने की अपेक्षा करता है कि आप अपनी तिथि को कैसे प्रारूपित करना चाहते हैं।
ईजी:
print today.strftime('We are the %d, %b %Y')
>>> 'We are the 22, Nov 2008'
सभी पत्र के बाद "%"
कुछ के लिए एक प्रारूप का प्रतिनिधित्व:
%d
दिन का नंबर है
%m
महीने की संख्या है
%b
महीने का संक्षिप्त नाम है
%y
वर्ष अंतिम दो अंक है
%Y
सभी वर्ष है
आदि
आधिकारिक दस्तावेज़ीकरण पर एक नज़र डालें , या मैकूचेन के त्वरित संदर्भ को आप उन सभी को नहीं जान सकते।
PEP3101 के बाद से , प्रत्येक ऑब्जेक्ट का अपना प्रारूप किसी भी स्ट्रिंग के विधि प्रारूप द्वारा स्वचालित रूप से उपयोग किया जा सकता है। डेटाइम के मामले में, प्रारूप वही है जो स्ट्रैफ़टाइम में उपयोग किया जाता है। तो आप इस तरह से ऊपर जैसा कर सकते हैं:
print "We are the {:%d, %b %Y}".format(today)
>>> 'We are the 22, Nov 2008'
इस रूप का लाभ यह है कि आप एक ही समय में अन्य वस्तुओं को भी परिवर्तित कर सकते हैं। फॉर्मैटेड स्ट्रिंग शाब्दिक (पायथन 3.6, 2016-12-23 के बाद से)
की शुरुआत के साथ इसे लिखा जा सकता है
import datetime
f"{datetime.datetime.now():%Y-%m-%d}"
>>> '2017-06-15'
स्थानीयकरण
यदि आप उन्हें सही तरीके से उपयोग करते हैं, तो तिथियां स्वचालित रूप से स्थानीय भाषा और संस्कृति के अनुकूल हो सकती हैं, लेकिन यह थोड़ा जटिल है। शायद एसओ (स्टैक ओवरफ्लो) पर एक और सवाल के लिए ;-)
str()
(सूची के प्रत्येक तत्व के लिए) आवेदन करके , क्योंकि यह सिर्फ वही है जोprint
आपके एकलtoday
ऑब्जेक्ट के लिए किया गया था ।