Memahami timedelta


90

Diberikan kode python di bawah ini, tolong bantu saya memahami apa yang terjadi di sana.

start_time = time.time()
time.sleep(42)
end_time = time.time()

uptime = end_time - start_time

human_uptime = str(datetime.timedelta(seconds=int(uptime)))

Jadi saya mendapatkan perbedaan antara start timedan end time, di baris 5 saya membulatkan durasi dengan casting dan apa sekarang, apa penjelasan selanjutnya?

Aku tahu apa artinya delta (rata-rata atau perbedaan), tapi kenapa aku harus melewati seconds = uptimeuntuk timedeltadan mengapa casting string yang bekerja begitu baik bahwa saya mendapatkan HH:MM:SS?

Jawaban:


115

Karena timedelta diartikan seperti:

class datetime.timedelta([days,] [seconds,] [microseconds,] [milliseconds,] [minutes,] [hours,] [weeks])

Semua argumen bersifat opsional dan default ke 0.

Anda dapat dengan mudah mengatakan "Tiga hari empat milidetik" dengan argumen opsional seperti itu.

>>> datetime.timedelta(days=3, milliseconds=4)
datetime.timedelta(3, 0, 4000)
>>> datetime.timedelta(3, 0, 0, 4) #no need for that.
datetime.timedelta(3, 0, 4000)

Dan untuk pengecoran str, mengembalikan nilai yang diformat bagus daripada __repr__untuk meningkatkan keterbacaan. Dari dokumen:

str (t) Mengembalikan string dalam bentuk [D hari [s],] [H] H: MM: SS [.UUUUUU], di mana D negatif untuk t negatif. (5)

>>> datetime.timedelta(seconds = 42).__repr__()
'datetime.timedelta(0, 42)'
>>> datetime.timedelta(seconds = 42).__str__()
'0:00:42'

Dokumentasi Checkout:

http://docs.python.org/library/datetime.html#timedelta-objects


13

mengapa saya harus melewatkan detik = uptime ke timedelta

Karena objek timedelta dapat dilalui detik, milidetik, hari, dll ... jadi Anda perlu menentukan apa yang Anda teruskan (inilah mengapa Anda menggunakan kunci eksplisit). Typecasting to inttidak berguna karena mereka juga bisa menerima float.

dan mengapa casting string bekerja dengan sangat baik sehingga saya mendapatkan HH: MM: SS?

Bukan typecasting yang memformat, ini adalah __str__metode internal objek. Bahkan Anda akan mencapai hasil yang sama jika Anda menulis:

print datetime.timedelta(seconds=int(uptime))

1
Anda mengisyaratkan hal ini, tetapi Perlu dicatat secara eksplisit bahwa timedelta melakukan lebih dari sekadar menampilkan sesuatu dalam format HH: MM: SS. Objek timedelta digunakan setiap kali Anda perlu mengambil perbedaan antara dua objek datetime.
Wilduck

1
Ini bukanlah __repr__metode, ini adalah __str__metode.
utdemir

1
Bukan __repr__()dari timedelta, tapi __str__()metodenya. printpanggilan __str()__untukmu.
bgporter
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.