टाइमडेलटा को समझना


90

नीचे दिए गए अजगर कोड को देखते हुए, कृपया मुझे समझने में मदद करें कि वहां क्या हो रहा है।

start_time = time.time()
time.sleep(42)
end_time = time.time()

uptime = end_time - start_time

human_uptime = str(datetime.timedelta(seconds=int(uptime)))

इसलिए मुझे अंतर आता है start timeऔर end timeलाइन 5 पर, मैं कास्टिंग करके अवधि बढ़ाता हूं और अब क्या है, आगे की व्याख्या क्या है?

मुझे पता है कि डेल्टा का क्या मतलब है (औसत या अंतर), लेकिन मुझे क्यों पास seconds = uptimeकरना है timedeltaऔर स्ट्रिंग कास्टिंग इतनी अच्छी तरह से क्यों काम करती है जो मुझे मिलती है HH:MM:SS?

जवाबों:


114

क्योंकि टाइमडेल्टा को इस तरह परिभाषित किया गया है:

class datetime.timedelta([days,] [seconds,] [microseconds,] [milliseconds,] [minutes,] [hours,] [weeks])

सभी तर्क वैकल्पिक और डिफ़ॉल्ट 0 हैं।

आप वैकल्पिक तर्क के साथ "तीन दिन और चार मिलीसेकंड" को आसानी से कह सकते हैं।

>>> datetime.timedelta(days=3, milliseconds=4)
datetime.timedelta(3, 0, 4000)
>>> datetime.timedelta(3, 0, 0, 4) #no need for that.
datetime.timedelta(3, 0, 4000)

और str कास्टिंग के लिए, यह __repr__पठनीयता में सुधार के बजाय एक अच्छा स्वरूपित मूल्य देता है। डॉक्स से:

str (t) फॉर्म [D दिन [s],] [H] H: MM: SS [.UUUUUU] के रूप में एक स्ट्रिंग लौटाता है, जहाँ D ऋणात्मक t के लिए ऋणात्मक है। (5)

>>> datetime.timedelta(seconds = 42).__repr__()
'datetime.timedelta(0, 42)'
>>> datetime.timedelta(seconds = 42).__str__()
'0:00:42'

चेकआउट प्रलेखन:

http://docs.python.org/library/datetime.html#timedelta-objects


13

मुझे सेकंड क्यों पास करना पड़ता है?

क्योंकि टाइमडेलटा ऑब्जेक्ट को सेकंड, मिलीसेकंड, दिन, आदि पास किया जा सकता है ... इसलिए आपको यह निर्दिष्ट करने की आवश्यकता है कि आप क्या पास कर रहे हैं (यही कारण है कि आप स्पष्ट कुंजी का उपयोग करते हैं)। टाइपकास्टिंग करना intबहुत ही अच्छा है क्योंकि वे तैरने को भी स्वीकार कर सकते हैं।

और स्ट्रिंग कास्टिंग इतनी अच्छी तरह से क्यों काम करती है कि मुझे HH: MM: SS मिलता है?

यह उस प्रारूप का टाइपकास्टिंग नहीं है, __str__जो ऑब्जेक्ट का आंतरिक तरीका है। यदि आप लिखते हैं तो वास्तव में आप वही परिणाम प्राप्त करेंगे:

print datetime.timedelta(seconds=int(uptime))

1
आप इस पर संकेत देते हैं, लेकिन यह स्पष्ट रूप से ध्यान देने योग्य है कि समयबद्धता एचएच: एमएम: एसएस प्रारूप में प्रदर्शित चीजों की तुलना में बहुत अधिक है। जब भी आपको दो डेटाटाइम ऑब्जेक्ट के बीच अंतर करने की आवश्यकता होती है, एक टाइमडेल्टा ऑब्जेक्ट का उपयोग किया जाता है।
Wilduck

1
यह __repr__विधि नहीं है , यह __str__विधि है।
utdemir

1
__repr__()समयसीमा का नहीं , बल्कि इसकी __str__()विधि का। आपके लिए printकॉल करता __str()__है।
bgporter
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.