2008-09-09 11 views
11

मेरे पास 2 बार मान हैं जिनके प्रकार datetime.time है। मैं उनका अंतर खोजना चाहता हूं। करने के लिए स्पष्ट बात टी 1 - टी 2 है, लेकिन यह काम नहीं करता है। यह datetime.datetime प्रकार की वस्तुओं के लिए काम करता है लेकिन datetime.time के लिए नहीं। तो ऐसा करने का सबसे अच्छा तरीका क्या है?पायथन में 2 बार के बीच अंतर खोजने का सबसे आसान तरीका क्या है?

उत्तर

-2

सबसे पहले, ध्यान दें कि एक datetime.time दिन का समय, किसी विशेष दिन से स्वतंत्र है, और इसलिए किसी भी दो datetime के बीच अलग-अलग .time मान 24 घंटे से कम होने जा रहा है।

एक दृष्टिकोण डेटाटाइमटाइम दोनों मानों को तुलनीय मानों (जैसे मिलीसेकंड) में परिवर्तित करना है, और अंतर ढूंढना है।

t1, t2 = datetime.time(...), datetime.time(...) 

t1_ms = (t1.hour*60*60 + t1.minute*60 + t1.second)*1000 + t1.microsecond 
t2_ms = (t2.hour*60*60 + t2.minute*60 + t2.second)*1000 + t2.microsecond 

delta_ms = max([t1_ms, t2_ms]) - min([t1_ms, t2_ms]) 

यह थोड़ा लंगड़ा है, लेकिन यह काम करता है।

+0

ध्यान दें कि यह समाधान साइन संरक्षित नहीं करता है। इसके अलावा, delta_ms = abs (t1_ms - t2_ms) कम से कम एक घटाव को समझने और सहेजने के लिए थोड़ा आसान है। –

+2

काम नहीं करता है अगर t1_ms मध्यरात्रि से पहले है और t2_ms मध्यरात्रि के बाद –

+0

यह 1000000 नहीं होना चाहिए? 1 एस = 1000000 μs के बाद से। – Paggas

1

ऐसा लगता है कि यह समर्थित नहीं है, क्योंकि डेटाटाइम में ओवरफ़्लो से निपटने का कोई अच्छा तरीका नहीं होगा। मुझे पता है कि यह सीधे उत्तर नहीं है, लेकिन शायद मेरे से अधिक अजगर अनुभव वाला कोई व्यक्ति इसे थोड़ा और ले सकता है। अधिक जानकारी के लिए, इसे देखें: http://bugs.python.org/issue3250

5

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

>>> import datetime as dt 
>>> t1 = dt.time(23, 5, 5, 5) 
>>> t2 = dt.time(10, 5, 5, 5) 
>>> dt1 = dt.timedelta(hours=t1.hour, minutes=t1.minute, seconds=t1.second, microseconds=t1.microsecond) 
>>> dt2 = dt.timedelta(hours=t2.hour, minutes=t2.minute, seconds=t2.second, microseconds=t2.microsecond) 
>>> print(dt1-dt2) 
13:00:00 
>>> print(dt2-dt1) 
-1 day, 11:00:00 
>>> print(abs(dt2-dt1)) 
13:00:00 

पाइथन में नकारात्मक टाइमडेल्टा ऑब्जेक्ट्स नकारात्मक क्षेत्र फ़ील्ड प्राप्त करते हैं, अन्य फ़ील्ड सकारात्मक होते हैं। आप पहले उनकी जांच कर सकता है: तुलना समय वस्तुओं और timedelta वस्तुओं दोनों पर काम करता है:

>>> dt2 < dt1 
True 
>>> t2 < t1 
True 
+2

chryss: आप गंभीरता से एक उदाहरण के साथ अच्छी तरह से कर सकता है यहाँ। – Arafangion

16
इसके अलावा

एक छोटे से मूर्ख है, लेकिन आप एक मनमाना दिन उठा और उस में हर बार embedding, datetime.datetime.combine का उपयोग कर, तो घटाकर की कोशिश कर सकते:

>>> import datetime 
>>> t1 = datetime.time(2,3,4) 
>>> t2 = datetime.time(18,20,59) 
>>> dummydate = datetime.date(2000,1,1) 
>>> datetime.datetime.combine(dummydate,t2) - datetime.datetime.combine(dummydate,t1) 
datetime.timedelta(0, 58675) 
3

अजगर pytz (http://pytz.sourceforge.net) मॉड्यूल जो गणित के लिए इस्तेमाल किया जा सकता है 'समय' वस्तुओं का। यह डीएसटी ऑफसेट्स का भी ख्याल रखता है। उपरोक्त पृष्ठ में कई उदाहरण हैं जो pytz के उपयोग को चित्रित करते हैं।

+0

* समय * को निर्दिष्ट किए बिना केवल समय जानने के लिए टाइमज़ोन के बारे में बात करना समझ में नहीं आता है। यदि आप दिनांक और समय दोनों जानते हैं तो [अंतर के लिए एकाधिक परिभाषाओं का उपयोग किया जा सकता है] (http://stackoverflow.com/a/25427822/4279) – jfs

-1

मिलीसेकंड में समय पुनर्प्राप्त करें और फिर घटाएं।

-3

पर्यावरण। यदि आपको कुछ जल्दी चाहिए तो टाइककाउंट अच्छी तरह से काम करता प्रतीत होता है।

पूर्णांक शुरू = Environment.TickCount

... DoSomething()

पूर्णांक elapsedtime = Environment.TickCount - शुरू

जॉन

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