proszę, jak konwertować int (liczba a sekundy) do tych formatów: mm: ss lub hh: mm: ss?Python: konwertowanie sekund hh: mm: ss
Potrzebuję zrobić to z kodem Pythona (i jeśli to możliwe w szablonie Django?).
Dziękuję bardzo ;-)
proszę, jak konwertować int (liczba a sekundy) do tych formatów: mm: ss lub hh: mm: ss?Python: konwertowanie sekund hh: mm: ss
Potrzebuję zrobić to z kodem Pythona (i jeśli to możliwe w szablonie Django?).
Dziękuję bardzo ;-)
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.
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'
@sth: SilentGhost ma deets. –
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). –
@ Glenn: Co jest nie tak z reprezentacją str()? –
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
minut to modulo 60, więc zawsze jest <60, więc godziny == 0 ... –
Ups, przepraszam, zamierzałem zrobić krok później ... naprawię –
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
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ą.
Serio, użyj divmod. –
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
>>> a = datetime.timedelta(seconds=65)
datetime.timedelta(0, 65)
>>> str(a)
'0:01:05'
h: mm: sss nie jest hh: mm: ss. –
poważnie? i czy warto zejść na dół? – SilentGhost
@Glenn: Jest całkiem niezły ... i jeśli OP chce go sformatować dalej, to nie jest to dokładnie rakieta. –
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.
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ć? –
+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
Gorsze debaty, niż ja sam szukałem podstawowe pytanie; są lepsze rzeczy do wydania na ... –
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
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'
, 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
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ń";) –
:) 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