django - Python:تحويل الثواني إلى hh:mm:ss




time (9)

ألا تكون شخصًا ثعبانيًا ولكن أسهل بدون أي مكتبات فقط:

total   = 3800
seconds = total % 60
total   = total - seconds
hours   = total / 3600
total   = total - (hours * 3600)
mins    = total / 60

الكود المحدث ، شكر sth

هذا السؤال لديه بالفعل إجابة هنا:

من فضلك ، كيف تقوم بتحويل int (عدد ثواني) إلى هذه التنسيقات: mm: ss أو hh: mm: ss ؟

أنا بحاجة إلى القيام بذلك مع رمز Python (وإذا كان ذلك ممكنا في قالب Django؟).

شكرا جزيلا ؛-)


إلى جانب حقيقة أن بايثون قد بنيت في دعم التواريخ والأوقات (انظر رد فعل كبير) ، فإن العثور على دقائق أو ساعات من الثواني أمر سهل:

minutes = seconds / 60
hours = minutes / 60

الآن ، عندما تريد عرض الدقائق أو الثواني ، قم بإدخال MOD عليها بزاوية 60 بحيث لا تكون أكبر من 59


إذا كنت بحاجة إلى إجراء ذلك كثيرًا ، فيمكنك حساب جميع السلاسل الممكنة لعدد من الثواني في اليوم:

try:
    from itertools import product
except ImportError:
    def product(*seqs):
        if len(seqs) == 2:
            for s1 in seqs[0]:
                for s2 in seqs[1]:
                    yield (s1,s2)
        else:
            for s in seqs[0]:
                for p in product(*seqs[1:]):
                    yield (s,) + p

hhmmss = {}
i = 0
for (h,m,s) in product(range(24),range(60),range(60)):
    hhmmss[i] = "%02d:%02d:%02d" % (h,m,s)
    i += 1

الآن تحويل الثواني لتنسيق السلسلة هو بحث سريع dict:

print hhmmss[12345]

مطبوعات

'03:25:45'

لا أستطيع أن أصدق أن أي من الإجابات العديدة تعطي ما أعتبره "طريقة واضحة للقيام بذلك" (وأنا لست حتى هولنديا ...! -) - ما يصل إلى أقل بقليل من 24 ساعة من ثانية (86399 ثانية ، على وجه التحديد):

>>> import time
>>> time.strftime('%H:%M:%S', time.gmtime(12345))
'03:25:45'

إن القيام بذلك في قالب Django أكثر دقة ، لأن مرشح time يدعم صيغة تنسيق الوقت غير تقليدي (مستوحاة ، على ما أعتقد ، من PHP) ، ويحتاج أيضًا إلى وحدة التاريخ والوقت وتطبيق المنطقة الزمنية مثل pytz ، لإعداد البيانات. فمثلا:

>>> from django import template as tt
>>> import pytz
>>> import datetime
>>> tt.Template('{{ x|time:"H:i:s" }}').render(
...     tt.Context({'x': datetime.datetime.fromtimestamp(12345, pytz.utc)}))
u'03:25:45'

استنادًا إلى احتياجاتك الدقيقة ، قد يكون من الأفضل تحديد فلتر مخصص لمهمة التنسيق هذه في تطبيقك.


الرمز الذي يفعل ما تم طلبه ، مع أمثلة ، ويوضح كيفية معالجة الحالات التي لم يحددها:

def format_seconds_to_hhmmss(seconds):
    hours = seconds // (60*60)
    seconds %= (60*60)
    minutes = seconds // 60
    seconds %= 60
    return "%02i:%02i:%02i" % (hours, minutes, seconds)

def format_seconds_to_mmss(seconds):
    minutes = seconds // 60
    seconds %= 60
    return "%02i:%02i" % (minutes, seconds)

minutes = 60
hours = 60*60
assert format_seconds_to_mmss(7*minutes + 30) == "07:30"
assert format_seconds_to_mmss(15*minutes + 30) == "15:30"
assert format_seconds_to_mmss(1000*minutes + 30) == "1000:30"

assert format_seconds_to_hhmmss(2*hours + 15*minutes + 30) == "02:15:30"
assert format_seconds_to_hhmmss(11*hours + 15*minutes + 30) == "11:15:30"
assert format_seconds_to_hhmmss(99*hours + 15*minutes + 30) == "99:15:30"
assert format_seconds_to_hhmmss(500*hours + 15*minutes + 30) == "500:15:30"

يمكنك - وربما ينبغي - أن تقوم بتخزينها على أنها timedelta بدلاً من int ، ولكن هذه قضية منفصلة و timedelta لا يجعل هذه المهمة بالتحديد أسهل.


يمكنك حساب عدد الدقائق والساعات من عدد الثواني بالتقسيم البسيط:

seconds = 12345
minutes = seconds // 60
hours = minutes // 60

print "%02d:%02d:%02d" % (hours, minutes % 60, seconds % 60)
print "%02d:%02d" % (minutes, seconds % 60)

هنا // is pythons integer division.


إذا كنت تستخدم Divmod ، فأنت محصن ضد النكهات المختلفة من التقسيم الصحيح:

# show time strings for 3800 seconds

# easy way to get mm:ss
print "%02d:%02d" % divmod(3800, 60)

# easy way to get hh:mm:ss
print "%02d:%02d:%02d" % \
    reduce(lambda ll,b : divmod(ll[0],b) + ll[1:],
        [(3800,),60,60])


# function to convert floating point number of seconds to 
# hh:mm:ss.sss
def secondsToStr(t):
    return "%02d:%02d:%02d.%03d" % \
        reduce(lambda ll,b : divmod(ll[0],b) + ll[1:],
            [(t*1000,),1000,60,60])

print secondsToStr(3800.123)

مطبوعات:

63:20
01:03:20
01:03:20.123

>>> a = datetime.timedelta(seconds=65)
datetime.timedelta(0, 65)
>>> str(a)
'0:01:05'

بالمناسبة ، فإن سبب عد السطر لإصدار C ++ هو واحد أكبر من العدد الخاص بإصدار Python هو أن علامة eof تتحقق فقط عند محاولة القراءة للقراءة خارج نطاق eof. لذا فإن الحلقة الصحيحة ستكون:

while (cin) {
    getline(cin, input_line);

    if (!cin.eof())
        line_count++;
};




python django time