İki tarih arasındaki farkı saniye cinsinden nasıl kontrol edebilirim?


181

Bunu yapmanın daha kolay bir yolu olmalı. Sık sık yenilenmesini isteyen nesneler var, bu yüzden oluşturuldukları zamanı kaydetmek, geçerli zaman damgasına karşı kontrol etmek ve gerektiğinde yenilemek istiyorum.

datetime.datetime zor olduğunu kanıtladı ve ctime kütüphanesine dalmak istemiyorum. Bu tür şeyler için daha kolay bir şey var mı?

Yanıtlar:


517

bilinen iki tarih arasındaki farkları hesaplamak istiyorsanız, şu şekilde kullanın total_seconds:

import datetime as dt

a = dt.datetime(2013,12,30,23,59,59)
b = dt.datetime(2013,12,31,23,59,59)

(b-a).total_seconds()

86400,0

#note that seconds doesn't give you what you want:
(b-a).seconds

0


95
`` Not '' insanların kaçırdığı en önemli kısımdır. Keşke başka bir oy verebilsem.
Dexter

Görünüşte ... yanlış bir sonuç verdiğini fark ettiğim zamanlar var. İkinci bir fark için 59.800 saniye. Yani, bu tür saniye, milisaniye veya mikrosaniye fark olarak daha küçük operasyonlar için, tek kullanabilirsiniz (b-a).microseconds(1000) saniye (1000000) ya da milisaniye almak için o bölmek sonra ve
Zld Productions

a ve b değiştirilse bile değerin her zaman pozitif olduğu görülür
Nickpick

@Nickpick değeri her zaman pozitif değildir. örneğin -60:from datetime import datetime; (datetime(2019, 1, 1, 0, 0) - datetime(2019, 1, 1, 0, 1)).total_seconds()
JDiMatteo

Etkileyici çözüm! Fonksiyonlar oluşturmak için temiz kod gerekli değildir.
Paulo zOiO zuLLu Fabrício

37
import time  
current = time.time()

...job...
end = time.time()
diff = end - current

Bu senin işine yarar mıydı?


1
+ 1; her iki çağırma tarihini de umursamıyoruz - geçen zamanı önemsiyoruz. Bu nedenle gösterildiği gibi ham bir zaman damgası kullanın.
Karl Knechtel

14
>>> from datetime import datetime

>>>  a = datetime.now()

# wait a bit 
>>> b = datetime.now()

>>> d = b - a # yields a timedelta object
>>> d.seconds
7

(7 biraz yukarıda beklediğiniz süre ne olacak)

Datetime.datetime öğesinin oldukça yararlı olduğunu düşünüyorum, bu nedenle karşılaştığınız karmaşık veya garip bir senaryo varsa, lütfen bize bildirin.

DÜZENLEME: @WoLpH sayesinde biri her zaman o kadar sık ​​sık yenilemek istemiyor dattes zaman birbirine yakın olacağını işaret için. Deltadaki günleri hesaba katarak daha uzun zaman damgası tutarsızlıklarıyla başa çıkabilirsiniz:

>>> a = datetime(2010, 12, 5)
>>> b = datetime(2010, 12, 7)
>>> d = b - a
>>> d.seconds
0
>>> d.days
2
>>> d.seconds + d.days * 86400
172800

1
d.seconds + d.days * 86400Bunun yerine geri dönerseniz , birkaç gün boyunca doğrudur;)
Wolph

7
Genel durumda, bunun doğru olmadığını unutmayın . Durumu daha öncea - b olduğu gibi düşünün (yani sonuç negatif olacaktır): while . Doğru yöntem, inanıyorum ki kullanmaktır … Ama bu sadece py2.7 + 'dır. a b(a - b).seconds == 86282a - b == datetime.timedelta(-1, 86276, 627665)timedelta.total_seconds()
David Wolever

4
Aslında, cevap doğru değil ve @DavidWolever yorumunu yansıtmalıdır. Doğru cevap: kullanın timedelta.total_seconds(). Buna göre indirildi.
astrojuanlu

3
Python 2.6 cevabı için oy verildi. total_seconds()2.7+ bir özelliktir.
Joe Holloway

@JoeHolloway Bu Python 2.6 da düzgün çalışmıyor sanırım.
zen11625

12

Python 2.7 ile total_seconds () fonksiyonumuz var. Lütfen python 2.6 için aşağıdaki koda bakınız.

import datetime
import time  

def diffdates(d1, d2):
    #Date format: %Y-%m-%d %H:%M:%S
    return (time.mktime(time.strptime(d2,"%Y-%m-%d %H:%M:%S")) -
               time.mktime(time.strptime(d1, "%Y-%m-%d %H:%M:%S")))

d1 = datetime.now()
d2 = datetime.now() + timedelta(days=1)
diff = diffdates(d1, d2)

0

İşte benim için çalışan.

from datetime import datetime

date_format = "%H:%M:%S"

# You could also pass datetime.time object in this part and convert it to string.
time_start = str('09:00:00') 
time_end = str('18:00:00')

# Then get the difference here.    
diff = datetime.strptime(time_end, date_format) - datetime.strptime(time_start, date_format)

# Get the time in hours i.e. 9.60, 8.5
result = diff.seconds / 3600;

Bu yardımcı olur umarım!

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.