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.