Diberi datetime.time
nilai dalam Python, apakah ada cara standar untuk menambahkan bilangan bulat detik ke dalamnya, sehingga 11:34:59
+ 3 = 11:35:02
, misalnya?
Gagasan yang jelas ini tidak berhasil:
>>> datetime.time(11, 34, 59) + 3
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'int'
>>> datetime.time(11, 34, 59) + datetime.timedelta(0, 3)
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.timedelta'
>>> datetime.time(11, 34, 59) + datetime.time(0, 0, 3)
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.time'
Pada akhirnya saya memiliki fungsi tertulis seperti ini:
def add_secs_to_time(timeval, secs_to_add):
secs = timeval.hour * 3600 + timeval.minute * 60 + timeval.second
secs += secs_to_add
return datetime.time(secs // 3600, (secs % 3600) // 60, secs % 60)
Saya tidak dapat berhenti berpikir bahwa saya kehilangan cara yang lebih mudah untuk melakukan ini.
Jawaban:
Anda dapat menggunakan
datetime
variabel penuh dengantimedelta
, dan dengan memberikan tanggal dummy lalu gunakantime
untuk hanya mendapatkan nilai waktu.Sebagai contoh:
menghasilkan dua nilai, terpisah tiga detik:
Anda juga dapat memilih yang lebih mudah dibaca
jika Anda cenderung.
Jika Anda mencari fungsi yang dapat melakukan ini, Anda dapat melihat menggunakan di
addSecs
bawah ini:Output ini:
sumber
Seperti yang dinyatakan orang lain di sini, Anda bisa menggunakan objek datetime penuh di seluruh:
Namun, saya pikir itu layak menjelaskan mengapa objek datetime penuh diperlukan. Pertimbangkan apa yang akan terjadi jika saya menambahkan 2 jam hingga 11 malam. Apa perilaku yang benar? Pengecualian, karena Anda tidak dapat memiliki waktu lebih dari 11:59 malam? Haruskah membungkus kembali?
Pemrogram yang berbeda akan mengharapkan hal yang berbeda, sehingga hasil mana pun yang mereka pilih akan mengejutkan banyak orang. Lebih buruk lagi, programmer akan menulis kode yang bekerja dengan baik ketika mereka mengujinya pada awalnya, dan kemudian istirahat dengan melakukan sesuatu yang tidak terduga. Ini sangat buruk, itulah sebabnya Anda tidak diizinkan menambahkan objek timedelta ke objek waktu.
sumber
Satu hal kecil, mungkin menambah kejelasan untuk mengganti nilai default untuk detik
sumber
Terima kasih kepada @Pax Diablo, @bvmou, dan @Arachnid untuk saran penggunaan datetime penuh. Jika saya harus menerima objek datetime.time dari sumber eksternal, maka ini tampaknya menjadi
add_secs_to_time()
fungsi alternatif :Kode verbose ini dapat dikompres ke lapisan satu ini:
tapi saya pikir saya ingin membungkusnya dalam suatu fungsi untuk kejelasan kode.
sumber
Jika perlu menambahkan file lain / ketergantungan pada proyek Anda, saya baru saja menulis sebuah kelas kecil yang diperluas
datetime.time
dengan kemampuan untuk melakukan aritmatika. Ketika Anda melewati tengah malam, itu membungkus sekitar nol. Sekarang, "Jam berapa sekarang, 24 jam dari sekarang" memiliki banyak kotak sudut, termasuk waktu musim panas, detik kabisat, perubahan zona waktu historis, dan sebagainya. Tetapi kadang-kadang Anda benar-benar membutuhkan kasing sederhana, dan itulah yang akan dilakukan.Contoh Anda akan ditulis:
nptime
mewarisi daridatetime.time
, jadi salah satu dari metode tersebut harus dapat digunakan juga.Ini tersedia dari PyPi sebagai
nptime
("waktu non-pedantic"), atau di GitHub: https://github.com/tgs/nptimesumber
Anda tidak dapat hanya menambahkan nomor
datetime
karena tidak jelas satuan apa yang digunakan: detik, jam, minggu ...Ada
timedelta
kelas untuk manipulasi dengan tanggal dan waktu.datetime
minusdatetime
memberitimedelta
,datetime
ditambahtimedelta
memberidatetime
, duadatetime
objek tidak dapat ditambahkan meskipun duatimedelta
bisa.Buat
timedelta
objek dengan berapa detik Anda ingin menambahkan dan menambahkannya kedatetime
objek:Ada konsep yang sama di C ++:
std::chrono::duration
.sumber
Demi kelengkapan, berikut cara melakukannya
arrow
(tanggal dan waktu yang lebih baik untuk Python):sumber
Coba tambahkan a
datetime.datetime
kedatetime.timedelta
. Jika Anda hanya menginginkan porsi waktu, Anda dapat memanggiltime()
metode padadatetime.datetime
objek yang dihasilkan untuk mendapatkannya.sumber
Pertanyaan lama, tapi saya pikir saya akan melempar fungsi yang menangani zona waktu. Bagian-bagian kunci yang melewati
datetime.time
objektzinfo
atribut dalam menggabungkan, dan kemudian menggunakantimetz()
bukannyatime()
pada datetime boneka yang dihasilkan. Jawaban ini sebagian diinspirasi oleh jawaban lain di sini.Dan inilah kelas case test yang sangat sederhana (menggunakan built-in
unittest
):sumber