Saniyeyi saat, dakika ve saniyeye nasıl dönüştürebilirim?


Yanıtlar:


765

datetime.timedeltaFonksiyonu kullanabilirsiniz :

>>> import datetime
>>> str(datetime.timedelta(seconds=666))
'0:11:06'

9
Daha sonra timedelta ve datetime nesnelerinde aritmetik kullanabileceğiniz için bu en iyi yoldur IMHO.
Matthew Schinckel

13
Bu, birkaç gün boyunca çalışır: str(datetime.timedelta(seconds=60*60*24+1))='1 day, 0:00:01'
hyprnick

3
str(datetime.timedelta(seconds=round(666666.55)))günleri doğru bir şekilde işler; ondalık saniyeleri bastırır.
CPBL

1
timedeltataşma güvenli değildir ve matematiksel işlemleri doğru şekilde gerçekleştiremez, örneğin str(timedelta(hours=8) - timedelta(hours=10))sonuç '-1 day, 22:00:00've tamsayı tabanlı çözüm tam olarak ihtiyacınız olan durumlar içindir '-02:00:00'.
cprn

1
+1. Bu cevap kolayca değiştirilebilir. Örneğin, yazdırma sırasında bir alanı atlamak istiyorsanız, şunu kullanın: stackoverflow.com/questions/7999935/…
eric_kernfeld

617

divmod()Hem bölümü hem de geri kalanını üretmek için yalnızca tek bir bölüm yapan işlevi kullanarak, yalnızca iki matematik işlemiyle çok hızlı bir şekilde sonuç alabilirsiniz:

m, s = divmod(seconds, 60)
h, m = divmod(m, 60)

Ardından sonucu istediğiniz çıktıya dönüştürmek için dize biçimlendirmesini kullanın:

print('{:d}:{:02d}:{:02d}'.format(h, m, s)) # Python 3
print(f'{h:d}:{m:02d}:{s:02d}') # Python 3.6+

2
İşleçleri işlevlere tercih ediyorsanız modulo'yu kullanın; örneğin (sadece dakika / saniye):'%d:%02dmn' % (seconds / 60, seconds % 60)
bufh

18
Ve güne uzatabilirsiniz: d, h = divmod(h, 24).
Mark Ransom

14
@ MarkRansom: ve ardından aylara m, d = divmod(m, 31). Oooops, hayır, yapamazsın. Daha da kötüsü, artık saniye oyuna girerseniz kodunuz yanlış olacaktır. Uzun lafın kısası: timedeltatakvimi kullanın ve uğraşmayın, sizi ısırır.

4
@Tibo timedeltaartık saniye ile uğraşıyor mu? Sanmıyorum. Bu basit matematiğin fazlasıyla yeterli olduğu birçok uygulama vardır.
Mark Ransom

1
@MarkRansom str(timedelta(hours=8) - timedelta(hours=10))sonuç '-1 gün, 22:00:00' yani ... saniye saniye ile çalışır ancak negatif sayılarla çalışmazsa idk.
cprn

70

Neredeyse kolay bir yol (en azından sözdizimini hatırlayamıyorum) adlandırabilirsiniz, ancak biçimlendirme üzerinde daha fazla kontrol sağlayan time.strftime kullanmak mümkündür :

from time import strftime
from time import gmtime

strftime("%H:%M:%S", gmtime(666))
'00:11:06'

strftime("%H:%M:%S", gmtime(60*60*24))
'00:00:00'

gmtime saniye strftime()gerektiren özel tuple biçimine dönüştürmek için kullanılır .

Not: 23:59:59'dan sonra kesilir


Peki, cevap aslında burada verilmektedir - stackoverflow.com/questions/1384406/…
anatoly techtonik

13
Ne yazık ki bu yöntem 1'den günleri ölçmeye başlar, bu nedenle zaman deltasını temsil etmek için tasarlanmamıştır ve bu nedenle gerçekleşmesini bekleyen bir kazadır. Örneğin time.strftime('%d %H:%M:%S', time.gmtime(1))=> '1 gün, 0:00:01' ile.
Riaz Rizvi

41

Kullanma datetime:

İle ':0>8'formatında:

from datetime import timedelta

"{:0>8}".format(str(timedelta(seconds=66)))
# Result: '00:01:06'

"{:0>8}".format(str(timedelta(seconds=666777)))
# Result: '7 days, 17:12:57'

"{:0>8}".format(str(timedelta(seconds=60*60*49+109)))
# Result: '2 days, 1:01:49'

':0>8'Biçim olmadan :

"{}".format(str(timedelta(seconds=66)))
# Result: '00:01:06'

"{}".format(str(timedelta(seconds=666777)))
# Result: '7 days, 17:12:57'

"{}".format(str(timedelta(seconds=60*60*49+109)))
# Result: '2 days, 1:01:49'

Kullanma time:

from time import gmtime
from time import strftime

# NOTE: The following resets if it goes over 23:59:59!

strftime("%H:%M:%S", gmtime(125))
# Result: '00:02:05'

strftime("%H:%M:%S", gmtime(60*60*24-1))
# Result: '23:59:59'

strftime("%H:%M:%S", gmtime(60*60*24))
# Result: '00:00:00'

strftime("%H:%M:%S", gmtime(666777))
# Result: '17:12:57'
# Wrong

1
delta bir saniyeden az ise başarısız olur:"{:0>8}".format(timedelta(milliseconds=66)) '0:00:00.066000'
jfs

1
Diğer herkese: without ':0>8':Örnekte, önde {:0>8}8 sıfıra giden 0. sıfır ped eksik .
TankorSmash

2
Python 3.5.2'de bir TypeError alıyorum. Bir time.time()-startdeğişkeni biçimlendiriyorum . Herhangi bir fikir? TypeError: non-empty format string passed to object.__format__
medley56

Benim timedelta nesnesini oluşturmak datetime.now()yerine kullanmayı denedim time.time()ve aynı hatayı alıyorum.
medley56

@ medley56 Python3 kullanırken, kullanıma gerek str()aşağıdakiler gibi kullanacağım bir format olacak eğer 0>8: "{:0>8}".format(str(datetime.timedelta(seconds=666777))). Daha fazla bilgi için bu cevabı kontrol edin .
Berriel


9

Değer almanız gerekiyorsa datetime.time, bu numarayı kullanabilirsiniz:

my_time = (datetime(1970,1,1) + timedelta(seconds=my_seconds)).time()

Sen ekleyemezsiniz timedeltaiçin time, bunlarla ekleyebilirsiniz datetime.

UPD : Aynı tekniğin başka bir varyasyonu:

my_time = (datetime.fromordinal(1) + timedelta(seconds=my_seconds)).time()

Bunun yerine 10'dan büyük herhangi bir sayı kullanabilirsiniz. Burada , bileşen datetime.fromordinalher zaman sıfır olacak şekilde datetimenesneyi döndürecek olguyu kullanıyoruz time.


6

İşte böyle anladım.

def sec2time(sec, n_msec=3):
    ''' Convert seconds to 'D days, HH:MM:SS.FFF' '''
    if hasattr(sec,'__len__'):
        return [sec2time(s) for s in sec]
    m, s = divmod(sec, 60)
    h, m = divmod(m, 60)
    d, h = divmod(h, 24)
    if n_msec > 0:
        pattern = '%%02d:%%02d:%%0%d.%df' % (n_msec+3, n_msec)
    else:
        pattern = r'%02d:%02d:%02d'
    if d == 0:
        return pattern % (h, m, s)
    return ('%d days, ' + pattern) % (d, h, m, s)

Bazı örnekler:

$ sec2time(10, 3)
Out: '00:00:10.000'

$ sec2time(1234567.8910, 0)
Out: '14 days, 06:56:07'

$ sec2time(1234567.8910, 4)
Out: '14 days, 06:56:07.8910'

$ sec2time([12, 345678.9], 3)
Out: ['00:00:12.000', '4 days, 00:01:18.900']

1
Bunun yukarıdaki cevaba göre avantajı nedir? str(datetime.timedelta(seconds=666))
Riaz Rizvi

@RiazRizvi, mikrosaniye 666.0ve 666.1değerler için tutarlı dize uzunluğu verir .
anatoly techtonik

6

Aşağıdaki set benim için çalıştı.

def sec_to_hours(seconds):
    a=str(seconds//3600)
    b=str((seconds%3600)//60)
    c=str((seconds%3600)%60)
    d=["{} hours {} mins {} seconds".format(a, b, c)]
    return d


print(sec_to_hours(10000))
# ['2 hours 46 mins 40 seconds']

print(sec_to_hours(60*60*24+105))
# ['24 hours 1 mins 45 seconds']

3

dateutil.relativedeltasaat, dakika ve saniye olarak yüzer olarak da erişmeniz gerekiyorsa kullanışlıdır. datetime.timedeltabenzer bir arayüz sağlamaz.

from dateutil.relativedelta import relativedelta
rt = relativedelta(seconds=5440)
print(rt.seconds)
print('{:02d}:{:02d}:{:02d}'.format(
    int(rt.hours), int(rt.minutes), int(rt.seconds)))

Baskılar

40.0
01:30:40

1
Sizden farklı çıktılar alıyorum, bu da bir yazım hatası olduğunu düşündürüyor. Muhtemelen kullanmak seconds=5440yerine kullanmak istediniz seconds=5540. Yine de cevabını beğendim!
JL

2

saat (h) saniye cinsinden kat bölümü (// olarak) 3600 (60 dakika / saat * 60 saniye / dakika) ile hesaplanmıştır

dakika (m) kalan saniyelerin kat bölümüne göre hesaplanır (saat hesaplamadan kalan,% olarak) 60 (60 sn / dak)

benzer şekilde, saat ve dakika hesaplaması kalan saniye (ler).

Gerisi sadece dize biçimlendirme!

def hms(seconds):
    h = seconds // 3600
    m = seconds % 3600 // 60
    s = seconds % 3600 % 60
    return '{:02d}:{:02d}:{:02d}'.format(h, m, s)

print(hms(7500))  # Should print 02h05m00s

Bu kod OP sorusuna bir çözüm sağlayabilir, ancak neden / nasıl çalıştığına dair bağlam eklemek daha iyidir. Bu, gelecekteki kullanıcıların bu bilgileri öğrenmelerine ve kendi kodlarına uygulamalarına yardımcı olabilir. Kod açıklandığında, kullanıcılardan upvotes şeklinde olumlu geri bildirimler almanız da olasıdır.
borchvm

2
Az önce, işaret ettiğiniz için teşekkürler @borchvm!
Sam

-2

Dakikayı almak için saniyeleri 60'a bölebilirsiniz

import time
seconds = time.time()
minutes = seconds / 60
print(minutes)

Tekrar 60'a böldüğünüzde,


-3

division = 3623 // 3600 #to hours
division2 = 600 // 60 #to minutes
print (division) #write hours
print (division2) #write minutes

PS Kodum profesyonel değil


2
hey, soru saat içinde bir biçim isteyin: dk: sn, basit bir bölüm değil ..
StupidWolf
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.