Ubah timedelta menjadi total detik

186

Saya memiliki perbedaan waktu

time1 = datetime.datetime.fromtimestamp(time.mktime(time.gmtime()))
...
time2 = datetime.datetime.fromtimestamp(time.mktime(time.gmtime()))
diff = time2 - time1

Sekarang, bagaimana cara menemukan jumlah detik yang berlalu? diff.secondstidak menghitung hari. Saya bisa melakukan:

diff.seconds + diff.days * 24 * 3600

Apakah ada metode bawaan untuk ini?

ripper234
sumber
8
@RestRisiko - Anda benar. Tetap saja, ada gunanya mengajukan pertanyaan tentang Stack Overflow, jadi lain kali saya, atau orang lain, Google untuk itu, ia memiliki jawaban yang bagus sebagai hasil teratas.
ripper234
Kita bisa membahas definisi alternatif "baik" nanti; tolong baca jawaban saya sebelum Anda melarikan diri :)
John Machin
Ada beberapa masalah dengan komputasi time1, dan diffdalam kode Anda. Untuk mendapatkan waktu utc saat ini sebagai objek datetime naif, gunakan datetime.utcnow()saja. Untuk memahami mengapa Anda harus menggunakan UTC alih-alih waktu setempat untuk menemukan perbedaannya, lihat Cari apakah 24 jam telah lewat di antara waktu-waktu - Python . time.monotonic()bisa lebih baik untuk menemukan waktu yang berlalu antara acara (bukan time.time()atau datetime.utcnow()).
jfs

Jawaban:

384

Gunakan timedelta.total_seconds().

>>> import datetime
>>> datetime.timedelta(seconds=24*60*60).total_seconds()
86400.0
Andreas Jung
sumber
26
Baru dalam python 2.7
Evgeny
7
Jika seseorang masih harus kompatibel dengan 2.6: Lihat stackoverflow.com/questions/3318348/... untuk cara memperpanjang datetime.timedelta dengan metode baru sendiri.
Uwe Geuder
6
datetime.timedelta.total_seconds (time2-time1) dalam Python3.6
Russo
8

Anda memiliki masalah dengan satu atau lain cara datetime.datetime.fromtimestamp(time.mktime(time.gmtime())) ekspresi .

(1) Jika yang Anda butuhkan adalah perbedaan antara dua instance dalam hitungan detik, yang paling sederhana time.time()adalah pekerjaannya.

(2) Jika Anda menggunakan stempel waktu untuk tujuan lain, Anda perlu mempertimbangkan apa yang Anda lakukan, karena hasilnya memiliki bau besar di atasnya:

gmtime()mengembalikan tuple waktu dalam UTC tetapi mktime()mengharapkan tuple waktu dalam waktu lokal.

Saya di Melbourne, Australia di mana TZ standarnya adalah UTC + 10, tetapi penghematan siang hari masih berlaku sampai besok pagi sehingga UTC + 11. Ketika saya mengeksekusi berikut, itu adalah 2011-04-02T20: 31 waktu setempat di sini ... UTC adalah 2011-04-02T09: 31

>>> import time, datetime
>>> t1 = time.gmtime()
>>> t2 = time.mktime(t1)
>>> t3 = datetime.datetime.fromtimestamp(t2)
>>> print t0
1301735358.78
>>> print t1
time.struct_time(tm_year=2011, tm_mon=4, tm_mday=2, tm_hour=9, tm_min=31, tm_sec=3, tm_wday=5, tm_yday=92, tm_isdst=0) ### this is UTC
>>> print t2
1301700663.0
>>> print t3
2011-04-02 10:31:03 ### this is UTC+1
>>> tt = time.time(); print tt
1301736663.88
>>> print datetime.datetime.now()
2011-04-02 20:31:03.882000 ### UTC+11, my local time
>>> print datetime.datetime(1970,1,1) + datetime.timedelta(seconds=tt)
2011-04-02 09:31:03.880000 ### UTC
>>> print time.localtime()
time.struct_time(tm_year=2011, tm_mon=4, tm_mday=2, tm_hour=20, tm_min=31, tm_sec=3, tm_wday=5, tm_yday=92, tm_isdst=1) ### UTC+11, my local time

Anda akan melihat bahwa t3, hasil dari ekspresi Anda adalah UTC + 1, yang tampaknya menjadi UTC + (perbedaan DST lokal saya) ... tidak terlalu berarti. Anda harus mempertimbangkan untuk menggunakan datetime.datetime.utcnow()yang tidak akan melompat satu jam ketika DST menyala / mati dan dapat memberikan Anda lebih presisi daripadatime.time()

John Machin
sumber
Terimakasih atas klarifikasinya. Untuk tujuan yang saya gunakan saat ini, perbedaan bahkan beberapa jam setiap sekarang dan kemudian tidak penting, tetapi saya akan pastikan untuk memeriksa ini di masa depan ketika saya menulis sesuatu yang lebih bermakna.
ripper234
-7

Anda dapat menggunakan modul mx.DateTime

import mx.DateTime as mt

t1 = mt.now() 
t2 = mt.now()
print int((t2-t1).seconds)
gopisubramni
sumber