Bir zaman çizelgesini günlere, saatlere ve dakikalara dönüştürme


243

Bir zaman dilimim var. Bundan günler, saatler ve dakikalar istiyorum - ya bir demet ya da sözlük olarak ... Telaşlanmıyorum.

Bunu yıllar boyunca bir düzine dilde yapmalıydım ama Python'un genellikle her şeye basit bir cevabı var, bu yüzden bu kadar basit (ama ayrıntılı) matematiği bozmadan önce burada soracağımı düşündüm.

Bay Fooz iyi bir noktaya değiniyor.

Ben her biri bir süresi vardır "listeleri" (biraz ebay listeleri gibi) ile ilgili. Yaparak kalan zamanı bulmaya çalışıyorumwhen_added + duration - now

Bunun DST'yi hesaba katmayacağını söylemem doğru mu? Değilse, bir saat eklemenin / çıkarmanın en basit yolu nedir?


Yalnızca SS: dd: ss biçiminde bir dize olarak almaksa , "datetime.timedelta (saniye = 1177)"timedelta nesnesinden " 0:19:37" deyin : str () kullanın
Peter Mortensen

Yanıtlar:


344

Bir datetime.timedeltadeğeriniz varsa td, td.dayszaten istediğiniz "günleri" verir. timedeltadeğerleri günün kesirini saniye olarak tutar (doğrudan saatler veya dakikalar değil), bu nedenle gerçekten de "naif bir şekilde basit matematik" gerçekleştirmeniz gerekir, örneğin:

def days_hours_minutes(td):
    return td.days, td.seconds//3600, (td.seconds//60)%60

1
Eğer unutmayın tdnegatiftir, -1 // 3600bir -1.
jcrs

4
neden // ? yerine /
Mohammed Shareef C

10
///float yerine tam sayı elde etmek için kullanılır . //bir kat bölümü operatörüdür: "sayı satırında sola ayarlanmış tam sayı ile sonuçlanan bölüm", buraya bakın .
Eerik Sven Puudist

1
Olarak @EerikSvenPuudist jcrssivri out, -1//3600olduğu -1, neden kullanmak int(td.seconds/3600)yerine çevirmek -1içine ikinci 0saat ziyade 1saat geriye doğru?
simpleuser

kalan saniyeleri de eklemeye ne dersiniz? days, hours, minutes = x.days, x.seconds // 3600, x.seconds %3600//60ve sonra seconds = x.seconds - hours*3600 - minutes*60
raphael

73

Bu biraz daha kompakt, iki satırda saat, dakika ve saniye elde edersiniz.

days = td.days
hours, remainder = divmod(td.seconds, 3600)
minutes, seconds = divmod(remainder, 60)
# If you want to take into account fractions of a second
seconds += td.microseconds / 1e6

7
td.dayssıfır değilse yanlıştır . Gerek hours += td.days*24. Bir saniyenin kesirlerini dikkate almak istiyorsanız (OP yapmaz); seconds += td.microseconds / 1e6kullanılabilir.
jfs

30
days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60

DST gelince, en iyi şey her iki datetimenesneyi saniye dönüştürmek olduğunu düşünüyorum . Bu şekilde sistem sizin için DST'yi hesaplar.

>>> m13 = datetime(2010, 3, 13, 8, 0, 0)  # 2010 March 13 8:00 AM
>>> m14 = datetime(2010, 3, 14, 8, 0, 0)  # DST starts on this day, in my time zone
>>> mktime(m14.timetuple()) - mktime(m13.timetuple())     # difference in seconds
82800.0
>>> _/3600                                                # convert to hours
23.0

1
mktime()yerel saat dilimi farklı zamanlarda farklı bir utc ofsetine sahipse başarısız olabilir (birçoğu yapar) - pytztz veritabanına taşınabilir bir dedeministik yolla erişmek için modülü kullanabilirsiniz . Ayrıca, yerel saat belirsiz olabilir (% 50 hata olasılığı) - belirsizleştirmek için bazı ek bilgilere ihtiyacınız vardır, örneğin, bir günlük dosyasındaki (her zaman değil) tarihler genellikle monotondur . Bkz. Bir günü bir piton tarihinden nasıl çıkarabilirim? benzer sorunlarla uğraşması gerekebilir.
jfs

7

Anlamıyorum

days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60

buna ne dersin

days, hours, minutes = td.days, td.seconds // 3600, td.seconds % 3600 / 60.0

Bir kayan nokta olarak dakikalar ve saniyeler alabilirsiniz.


0

Aşağıdakileri kullandım:

delta = timedelta()
totalMinute, second = divmod(delta.seconds, 60)
hour, minute = divmod(totalMinute, 60)
print(f"{hour}h{minute:02}m{second:02}s")

-3

timedeltas bir daysve secondsniteliğine sahiptir .. bunları kolayca kendiniz dönüştürebilirsiniz.

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.