Bagaimana cara memeriksa perbedaannya, dalam detik, antara dua tanggal?


180

Harus ada cara yang lebih mudah untuk melakukan ini. Saya memiliki objek yang ingin di-refresh sesering mungkin, jadi saya ingin merekam ketika mereka dibuat, memeriksa stempel waktu saat ini, dan menyegarkan seperlunya.

datetime.datetime telah terbukti sulit, dan saya tidak ingin masuk ke perpustakaan waktu. Adakah yang lebih mudah untuk hal semacam ini?

Jawaban:


516

jika Anda ingin menghitung perbedaan antara dua tanggal yang diketahui, gunakan total_secondsseperti ini:

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
`Catatan 'adalah bagian terpenting yang dilewatkan orang. Saya berharap bisa memberikan suara lagi di atasnya.
Dexter

Ada saat di mana saya perhatikan itu memberikan ... hasil yang keliru. 59.800 detik untuk perbedaan sepersekian detik. Jadi, untuk operasi yang lebih kecil, seperti selisih detik, milidetik, atau mikrodetik, orang dapat menggunakan (b-a).microsecondsdan kemudian membaginya untuk mendapatkan detik (1000000) atau milidetik (1000)
Zld Productions

tampaknya nilainya selalu positif, bahkan ketika a dan b bertukar
Nickpick

@Niklik nilai tidak selalu positif. misalnya yang berikut ini adalah -60:from datetime import datetime; (datetime(2019, 1, 1, 0, 0) - datetime(2019, 1, 1, 0, 1)).total_seconds()
JDiMatteo

Solusi yang mengesankan! Kode bersih tidak diperlukan untuk membuat fungsi.
Paulo zOiO zuLLu Fabrício

36
import time  
current = time.time()

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

apakah itu akan berhasil untuk Anda?


1
+1; kami tidak benar-benar peduli tentang tanggal doa baik - kami peduli tentang waktu yang berlalu. Jadi cukup gunakan cap waktu mentah, seperti yang ditunjukkan.
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 akan menjadi jumlah waktu berapa pun Anda menunggu sedikit di atas)

Saya menemukan datetime.datetime cukup berguna, jadi jika ada skenario rumit atau canggung yang Anda temui, beri tahu kami.

EDIT: Terima kasih kepada @WoLpH untuk menunjukkan bahwa seseorang tidak selalu mencari untuk menyegarkan begitu sering sehingga datetimes akan berdekatan. Dengan menghitung hari-hari di delta, Anda dapat menangani perbedaan cap waktu yang lebih lama:

>>> 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
Jika Anda kembali d.seconds + d.days * 86400, itu benar untuk beberapa hari;)
Wolph

7
Perhatikan bahwa, dalam kasus umum, ini tidak benar . Pertimbangkan kasus a - b, di mana aadalah sebelum b (yaitu, sehingga hasilnya akan negatif): (a - b).seconds == 86282sementara a - b == datetime.timedelta(-1, 86276, 627665). Metode yang benar, saya percaya, adalah menggunakan timedelta.total_seconds()... Tapi itu hanya py2.7 +.
David Wolever

4
Memang, jawabannya tidak benar dan harus mencerminkan komentar @vidviderver. Jawaban yang benar adalah: gunakan timedelta.total_seconds(). Diturunkan sesuai.
astrojuanlu

3
Terpilih untuk jawaban Python 2.6. total_seconds()adalah fitur 2.7+.
Joe Holloway

@ JoHolloway Saya kira ini tidak berfungsi dengan benar di Python 2.6 juga.
zen11625

12

Kami memiliki fungsi total_seconds () dengan Python 2.7 Silakan lihat kode di bawah ini untuk python 2.6

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

Inilah yang bekerja untuk saya.

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;

Semoga ini membantu!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.