2011-03-10 11 views
63

मैं दो datetime.time मूल्यों, exit और enter है और मैं की तरह कुछ करना चाहता हूँ:घटाना अजगर में दो बार

TypeError: unsupported operand type(s) for -: 'datetime.time' and 'datetime.time 

मैं कैसे करते हैं:

duration = exit - enter 

हालांकि, मैं इस त्रुटि मिलती है यह सही ढंग से? एक संभावित समाधान time चर को datetime चरों में परिवर्तित कर रहा है और फिर घटाएं, लेकिन मुझे यकीन है कि आपके पास लोगों के पास एक बेहतर और क्लीनर तरीका होना चाहिए।

+1

मैं इस उत्तर दिए गए प्रश्न को ऊपर उठाना चाहता हूं लेकिन जब तक कोई जवाब स्वीकार नहीं किया जाता है तब तक मैं नहीं करूँगा। – raratiru

उत्तर

3

datetime.time इसका समर्थन नहीं करता है, क्योंकि यह इस तरह से समय घटाने के लिए अर्थहीन है। यदि आप ऐसा करना चाहते हैं तो पूर्ण datetime.datetime का उपयोग करें।

+35

यदि आप अपने डोमेन से जानते हैं कि दो 'डेटाटाइम.टाइम' ऑब्जेक्ट्स 'ए' और' बी' उसी दिन से हैं, और वह 'बी> ए' है, तो ऑपरेशन 'बी-ए' का सही अर्थ है। – swalog

+2

भले ही वे एक ही दिन न हों, फिर भी यह अच्छी समझ में आता है। कम से कम 'आर्कटान (0) = (0, पीआई, 2 पीआई, ...)' के रूप में ज्यादा अर्थ है, लेकिन हम पहले के बाद उन मानों में से किसी के बारे में परवाह नहीं करते हैं। तो, '4:00 - 20: 00'' 8: 00' है - यह भी है ('32: 00',' 56: 00', ...), लेकिन कौन परवाह करता है? – naught101

+0

[जब तक यह उन मामलों में से एक नहीं है जो नहीं करता है।] (Https://www.youtube.com/watch?v=-5wpm-gesOY) –

60

इस प्रयास करें:

from datetime import datetime, date 

datetime.combine(date.today(), exit) - datetime.combine(date.today(), enter) 

combine एक datetime, कि घटाया जा सकता बनाता है।

+20

उम्मीद है कि यह मध्यरात्रि नहीं है ... –

+2

@ IgnacioVazquez-Abrams बिंदु पर, कोई भी 'date.today()' के बजाय 'डेटाटाइम (1,1,1,0,0,0)' का उपयोग कर सकता है। । – Akavall

+12

'निकास' 'निकास' नाम न दें, क्योंकि 'निकास' एक अंतर्निहित फ़ंक्शन है। – orokusaki

4
import datetime 

def diff_times_in_seconds(t1, t2): 
    # caveat emptor - assumes t1 & t2 are python times, on the same day and t2 is after t1 
    h1, m1, s1 = t1.hour, t1.minute, t1.second 
    h2, m2, s2 = t2.hour, t2.minute, t2.second 
    t1_secs = s1 + 60 * (m1 + 60*h1) 
    t2_secs = s2 + 60 * (m2 + 60*h2) 
    return(t2_secs - t1_secs) 

# using it 
diff_times_in_seconds(datetime.datetime.strptime("13:23:34", '%H:%M:%S').time(),datetime.datetime.strptime("14:02:39", '%H:%M:%S').time()) 
3
बजाय समय कोशिश timedelta का उपयोग करने का

:

from datetime import timedelta 

t1 = timedelta(hours=7, minutes=36) 
t2 = timedelta(hours=11, minutes=32) 
t3 = timedelta(hours=13, minutes=7) 
t4 = timedelta(hours=21, minutes=0) 

arrival = t2 - t1 
lunch = (t3 - t2 - timedelta(hours=1)) 
departure = t4 - t3 

print(arrival, lunch, departure) 
2

मैं आप के रूप में इसी तरह की स्थिति थी और मैं बाहरी लाइब्रेरी का उपयोग कर के साथ समाप्त हो गया arrow कहा जाता है।

>>> import arrow 
>>> enter = arrow.get('12:30:45', 'HH:mm:ss') 
>>> exit = arrow.now() 
>>> duration = exit - enter 
>>> duration 
datetime.timedelta(736225, 14377, 757451) 
21

उपयोग::

यहाँ कि यह दिखता है

from datetime import datetime, date 

duration = datetime.combine(date.min, end) - datetime.combine(date.min, beginning) 

date.min उपयोग में कुछ अधिक संक्षिप्त है और यहां तक ​​कि आधी रात में काम करता है।

यह date.today() के साथ मामला नहीं हो सकता है जो पहली कॉल 23:59:59 पर और अगले 00:00:00 बजे होता है तो अप्रत्याशित परिणाम लौटा सकता है।

+1

आपके साथ सहमत हैं। – ramwin

2

पायथन timedelta लाइब्रेरी आपको जो चाहिए वह करना चाहिए। जब आप दो datetime उदाहरण घटाते हैं तो timedelta वापस आ जाता है।

import datetime 
dt_started = datetime.datetime.utcnow() 

# do some stuff 

dt_ended = datetime.datetime.utcnow() 
print((dt_ended - dt_started).total_seconds()) 
संबंधित मुद्दे