एक समयसीमा को दिन, घंटे और मिनट में परिवर्तित करें


243

मुझे एक टाइमलेटा मिल गया है। मैं उस से दिन, घंटे और मिनट चाहता हूं - या तो एक टपल या एक शब्दकोश के रूप में ... मैं उपद्रव नहीं कर रहा हूं।

मैंने वर्षों में एक दर्जन भाषाओं में ऐसा दर्जनों बार किया होगा, लेकिन पायथन के पास आमतौर पर हर चीज का एक सरल उत्तर होता है, इसलिए मैंने सोचा कि मैं कुछ सरलता से (अभी तक क्रिया) गणित को समाप्त करने से पहले यहां पूछूंगा।

श्री फूज़ एक अच्छी बात उठाते हैं।

मैं "लिस्टिंग" (ईबे लिस्टिंग की तरह एक सा) के साथ काम कर रहा हूं जहां हर एक की अवधि होती है। मैं कोशिश कर रहा हूं कि समय बचा रह जाएwhen_added + duration - now

क्या मैं यह कहने में सही हूं कि डीएसटी का कोई हिसाब नहीं होगा? यदि नहीं, तो एक घंटा जोड़ने / घटाने का सबसे सरल तरीका क्या है?


यदि इसे HH: mm: ss प्रारूप में स्ट्रिंग के रूप में प्राप्त करना है , तो ऑब्जेक्ट "datetime.timedelta (सेकंड = 1177)" से "0:19:37" कहें : बस str का उपयोग करें ()timedelta
पीटर मोर्टेंस

जवाबों:


344

यदि आपके पास एक datetime.timedeltaमूल्य है td, तो td.daysपहले से ही आपको "दिन" चाहिए जो आप चाहते हैं। timedeltaमान कुछ दिनों के अंशों को सेकंड के रूप में रखते हैं (सीधे घंटे या मिनट नहीं) तो आपको वास्तव में "सरलता से सरल गणित" करना होगा, जैसे:

def days_hours_minutes(td):
    return td.days, td.seconds//3600, (td.seconds//60)%60

1
ध्यान रखें कि यदि tdऋणात्मक है, -1 // 3600है -1
jcrs

4
क्यों // ? के बजाय /
मोहम्मद शरीफ C

10
//के बजाय /एक पूर्णांक प्राप्त करने के लिए उपयोग किया जाता है , फ्लोट नहीं। //एक फ्लोर डिवीजन ऑपरेटर है: "डिवीजन जिसके परिणामस्वरूप पूरी संख्या संख्या रेखा में बाईं ओर समायोजित होती है", यहां देखें ।
एरिक स्वेन पूडिस्ट

1
@EerikSvenPuudist जैसा कि jcrsबताया गया -1//3600है -1, इसलिए घंटे के बजाय घंटे को दूसरे में int(td.seconds/3600)बदलने की बजाय इसका उपयोग क्यों करें ? -101
सरल

शेष सेकंड को भी कैसे जोड़ा जाए? days, hours, minutes = x.days, x.seconds // 3600, x.seconds %3600//60और फिर seconds = x.seconds - hours*3600 - minutes*60
राफेल

73

यह थोड़ा अधिक कॉम्पैक्ट है, आपको दो लाइनों में घंटे, मिनट और सेकंड मिलते हैं।

days = td.days
hours, remainder = divmod(td.seconds, 3600)
minutes, seconds = divmod(remainder, 60)
# If you want to take into account fractions of a second
seconds += td.microseconds / 1e6

7
यह td.daysगैर-शून्य है तो गलत है। आपको जरूरत है hours += td.days*24। यदि आप एक दूसरे के अंशों को ध्यान में रखना चाहते हैं (ओपी नहीं); seconds += td.microseconds / 1e6इस्तेमाल किया जा सकता है।
JFS

30
days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60

डीएसटी के लिए, मुझे लगता है कि सबसे अच्छी बात दोनों datetimeवस्तुओं को सेकंड में बदलना है । इस तरह सिस्टम आपके लिए डीएसटी की गणना करता है।

>>> m13 = datetime(2010, 3, 13, 8, 0, 0)  # 2010 March 13 8:00 AM
>>> m14 = datetime(2010, 3, 14, 8, 0, 0)  # DST starts on this day, in my time zone
>>> mktime(m14.timetuple()) - mktime(m13.timetuple())     # difference in seconds
82800.0
>>> _/3600                                                # convert to hours
23.0

1
mktime()विफल हो सकता है अगर स्थानीय टाइमज़ोन में अलग-अलग समय पर एक अलग utc ऑफसेट हो सकता है (कई करते हैं) - आप pytzपोर्टेबल डेटेमिनिस्टिक तरीके से tz डेटाबेस तक पहुंचने के लिए मॉड्यूल का उपयोग कर सकते हैं । इसके अलावा, स्थानीय समय अस्पष्ट हो सकता है (त्रुटि का 50% संभावना) - आपको कुछ अतिरिक्त जानकारी की आवश्यकता होती है जैसे, अक्सर (हमेशा नहीं) एक लॉग फ़ाइल में दिनांक नीरस होती हैं । देखें कि मैं अजगर की तारीख से एक दिन कैसे घटा सकता हूं? कि इसी तरह के मुद्दों से निपटने के लिए हो सकता है।
JFS

7

मुझे समझ नहीं आ रहा है

days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60

इस बारे में कैसा है

days, hours, minutes = td.days, td.seconds // 3600, td.seconds % 3600 / 60.0

आपको एक मिनट के मिनट और सेकंड एक फ्लोट के रूप में मिलते हैं।


0

मैंने निम्नलिखित प्रयोग किया:

delta = timedelta()
totalMinute, second = divmod(delta.seconds, 60)
hour, minute = divmod(totalMinute, 60)
print(f"{hour}h{minute:02}m{second:02}s")

-2

timedeltas में एक विशेषता daysऔर secondsविशेषता है .. आप उन्हें आसानी से परिवर्तित कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.