2009-09-05 12 views

Antwort

90

Ich kann nicht glauben, dass eine der vielen Antworten das gibt, was ich als den "offensichtlichen Weg" betrachte (und ich bin nicht mal Holländer ...! -) - bis knapp unter 24 Stunden im wert von Sekunden (86.399 Sekunden, speziell):

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

es in einer wählerischen ist Django-Vorlage tun, da die time Filter unterstützen eine flippige Zeit-Formatierung Syntax (inspiriert, glaube ich, von PHP), und benötigt außerdem das datetime-Modul und eine Zeitzonenimplementierung wie pytz, um die Daten vorzubereiten.Beispiel:

>>> 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' 

Abhängig von Ihren genauen Anforderungen ist es möglicherweise einfacher, einen benutzerdefinierten Filter für diese Formatierungsaufgabe in Ihrer App zu definieren.

+0

während es ein kleines Problem ist, das möglicherweise irrelevant für das OP 'time.straftime ('% H:% M:% S', time.gmtime (864001)) 'eine böse Überraschung zurückgeben. – SilentGhost

+1

Yep, funktioniert nur für einen Tag - wie auch Ihre Lösung natürlich, die anders als "Umbrechen" bricht, da 'str (datetime.timedelta (Sekunden = 86400))' sagt "1 Tag"; -) –

+0

:) Ich glaube nicht, dass meine Lösung * zusammenbricht *, es bietet immer noch die lesbarste Ausgabe, da OP nicht an der Diskussion hier teilgenommen hat, kann ich frei davon ausgehen, dass das genau das ist, was er will . – SilentGhost

8

Haben Sie auf dem datetime Modul nachlesen?

Bearbeiten/aktualisieren: Die Antwort von SilentGhost hat die Details, die meine Antwort auslässt. Wenn Sie diese Antwort mögen, +1 auch sein (oder stattdessen). Reposted hier:

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

@sth: SilentGhost die deets hat. –

+0

Ich glaube nicht, dass irgendetwas in datetime tut, was er will. Es gibt nichts wie timedelta.strftime, und selbst wenn er seine "Anzahl an Sekunden" als Timedelta speichert (was er wahrscheinlich tun sollte), müsste er die Formatierung selbst vornehmen. Es in eine Zeit umzuwandeln würde ein Hack sein, da er scheinbar eine gewisse Zeit (Timedelta) hat und nicht eine Tageszeit (Zeit). –

+0

@Glenn: Was stimmt nicht mit der Darstellung von str()? –

0

Neben der Tatsache, dass Python hat für Daten und Zeiten zur Unterstützung gebaut, finden Minuten oder Stunden von Sekunden (bigmattyh Antwort sehen) ist einfach:

minutes = seconds/60 
hours = minutes/60 

Nun, wenn Sie wollen sie Minuten oder Sekunden, MOD um 60 angezeigt werden, so dass sie nicht größer als 59

+1

Minuten ist modulo 60, so ist es immer <60, also Stunden == 0 ... –

+0

Hoppla, sorry, soll diesen Schritt nachher tun ... wird behoben –

0

kein python Person zu sein, aber am einfachsten ohne Bibliotheken nur:

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

Aktualisiert Code dank etw

+1

Das gibt 200 Stunden für 3800 Sekunden ... – sth

+0

danke etw , poste nicht ungeprüften Code, wenn du müde bist, wurde bemerkt :) – gaqzi

+0

Wir waren alle dort ... –

7

Sie können die Anzahl von Minuten und Stunden von der Anzahl der Sekunden durch einfache Division berechnen:

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

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

Hier // ist Pythons Integer-Division.

+1

Serious, benutze divmod. –

1

Seien Sie vorsichtig, wenn Sie durch 60 dividieren: Division zwischen Ganzzahlen gibt eine Ganzzahl zurück -> 12/60 = 0, es sei denn, Sie importieren Division von Zukunft. Hier finden Sie Kopieren und Einfügen von Python 2.6.2:

IDLE 2.6.2  
>>> 12/60 
0 
>>> from __future__ import division 
>>> 12/60 
0.20000000000000001 
51
>>> a = datetime.timedelta(seconds=65) 
datetime.timedelta(0, 65) 
>>> str(a) 
'0:01:05' 
+0

h: mm: sss ist nicht hh: mm: ss. –

+4

ernst? und es lohnt sich downvote? – SilentGhost

+2

@Glenn: Es ist ziemlich gut ... und wenn das OP es weiter formatieren will, ist es nicht gerade Raketenwissenschaft von hier. –

17

Code, was mit Beispielen angefordert, tut wurde, und das zeigt, wie Fälle, die er nicht behandelt werden haben angeben:

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" 

Sie können dies - und sollten es wahrscheinlich auch - als Timedelta anstatt als Int speichern, aber das ist ein separates Problem, und Timedelta vereinfacht diese Aufgabe nicht.

+0

Wählen Sie eine saubere, klare Lösung, die genau das gibt, was angefordert wurde, komplett mit Tests - ein leuchtendes Beispiel für das Wahlsystem von StackOverflow. Wer kümmert sich darum? –

+0

+1: Nette, gründliche und flexible Antwort; und teilweise dem Downvote entgegenzuwirken. (Obwohl ich nicht beabsichtige, die Debatte über Datetime und das hier einzuschätzen, gehe ich davon aus, dass das OP bald darauf sagen wird, worauf er hoffte.) – tom10

+0

Eine etwas hitzigere Debatte, als ich selbst für so etwas suchte Grundfrage; es gibt bessere Dinge, um Energie auszugeben ... –

7

Wenn Sie divmod verwenden, Sie sind immun gegen verschiedene Varianten von Integer-Division:

# 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) 

Drucke:

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

Wenn Sie diese viel tun, dann können Sie alle möglichen Strings vorauszuberechnen für die Anzahl der Sekunden an einem Tag:

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 

Jetzt Umwandlung von Sekunden zum Format strin g ist ein schneller dict-Lookup:

print hhmmss[12345] 

druckt

'03:25:45' 
Verwandte Themen