2009-09-05 16 views

Odpowiedz

90

Nie mogę uwierzyć, że któraś z wielu odpowiedzi daje coś, co uważam za "jeden oczywisty sposób na zrobienie tego" (a nawet nie jestem Holendrem ...! -) - nawet poniżej 24 warto godzinne sekund (86399 sekund, a konkretnie):

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

robi to w Django szablon jest bardziej wybredny, ponieważ filtr time obsługuje czasie formatowania ostry składni (inspirowany, jak sądzę, z PHP), a potrzebuje również modułu datetime i implementacji strefy czasowej, takiej jak pytz, do przygotowania danych.Na przykład:

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

W zależności od Twoich potrzeb może być wygodniej zdefiniować niestandardowy filtr dla tego zadania formatowania w Twojej aplikacji.

+0

, podczas gdy jest to niewielki problem, który jest prawdopodobnie nieistotny dla OP 'time.strftime ('% H:% M:% S', time.gmtime (864001))' zwraca nieprzyjemną niespodziankę. – SilentGhost

+1

Tak, działa tylko przez jeden dzień - podobnie jak twoje rozwiązanie oczywiście, które rozkłada się inaczej zamiast "owijania wokół", ponieważ 'str (datetime.timedelta (sekundy = 86400))" mówi "1 dzień";) –

+0

:) Nie sądzę, że moje rozwiązanie * zepsuje *, nadal zapewnia najbardziej czytelny wynik, ponieważ OP nie uczestniczył w dyskusji tutaj, mogę założyć, że właśnie tego chce . – SilentGhost

8

Czytałeś się na module datetime?

Edycja/aktualizacja: Odpowiedź SilentGhost zawiera szczegóły, na które moja odpowiedź nie została podana. Jeśli podoba ci się ta odpowiedź, daj +1 również (lub zamiast). Zamieszczać tutaj:

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

@sth: SilentGhost ma deets. –

+0

Nie sądzę, że cokolwiek w datetime robi to, co chce. Nie ma to jak timedelta.strftime, więc nawet jeśli zapisze swoją "liczbę sekund" jako timedelta (co prawdopodobnie powinien), to sam będzie musiał sam wykonać formatowanie. Konwersja go na czas byłaby hackowaniem, ponieważ wydaje się, że ma dużo czasu (timedelta), a nie porę dnia (czasu). –

+0

@ Glenn: Co jest nie tak z reprezentacją str()? –

0

Poza faktem, że Python ma wbudowane wsparcie dla dat i czasów (patrz odpowiedź bigmattyh za), znalezienie minut lub godzin od sekund jest prosta:

minutes = seconds/60 
hours = minutes/60 

Teraz, kiedy chcesz wyświetlanie minut lub sekund, MOD je przez 60 lat, tak że nie będzie większa niż 59

+1

minut to modulo 60, więc zawsze jest <60, więc godziny == 0 ... –

+0

Ups, przepraszam, zamierzałem zrobić krok później ... naprawię –

0

niebędący osobą python ale najłatwiej bez bibliotek tylko:

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

Zaktualizowany kod, dzięki sth

+1

Daje to 200 godzin na 3800 sekund ... – sth

+0

dziękuje sth , nie publikuj nietestowanego kodu, gdy jesteś zmęczony, odnotowano :) – gaqzi

+0

Wszyscy byliśmy tam ... –

7

Można obliczyć liczbę minut i godzin od liczby sekund przez prosty podział:

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

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

Tutaj // jest podział pytony całkowitą.

+1

Serio, użyj divmod. –

1

Po prostu zachowaj ostrożność dzieląc przez 60: dzielenie liczb całkowitych zwraca liczbę całkowitą -> 12/60 = 0, chyba że importujesz podział z przyszłości. Poniżej kopiowania i wklejania z 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 nie jest hh: mm: ss. –

+4

poważnie? i czy warto zejść na dół? – SilentGhost

+2

@Glenn: Jest całkiem niezły ... i jeśli OP chce go sformatować dalej, to nie jest to dokładnie rakieta. –

17

Kod, który robi to, co było wymagane, z przykładami i pokazując, jak przypadki nie są obsługiwane określić:

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" 

Możesz - i prawdopodobnie powinieneś - zapisywać to jako timedelta zamiast int, ale jest to oddzielna kwestia, a timedelta w rzeczywistości nie ułatwia tego konkretnego zadania.

+0

Głosowanie czystym, przejrzystym rozwiązaniem, które daje dokładnie to, o co prosiliśmy, wraz z testami - świetnym przykładem systemu głosowania StackOverflow. Czy ktoś chce się spierać? –

+0

+1: Dobra, dokładna i elastyczna odpowiedź; a częściowo w celu przeciwstawienia się przegranym. (Chociaż nie mam zamiaru wtrącać się w debatę na temat datetime i tego - zakładam, że PO będzie mówił to, co miał nadzieję wkrótce.) – tom10

+0

Gorsze debaty, niż ja sam szukałem podstawowe pytanie; są lepsze rzeczy do wydania na ... –

7

Jeśli używasz divmod, jesteś odporny na różnych smakach podziału integer:

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

Wydruki:

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

Jeśli trzeba zrobić wiele, można precalculate wszystkich możliwych ciągów dla liczby sekund w ciągu dnia:

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 

Teraz konwersja sekund do formatu strin g jest szybka DICT odnośnika:

print hhmmss[12345] 

drukuje

'03:25:45' 
Powiązane problemy