Bagaimana cara membandingkan waktu dengan Python?

105

Saya melihat bahwa perbandingan tanggal dapat dilakukan dan ada juga datetime.timedelta(), tetapi saya berjuang untuk mengetahui bagaimana cara memeriksa apakah waktu saat ini ( datetime.datetime.now()) lebih awal, lebih lambat atau sama dari waktu yang ditentukan (misalnya 8 pagi) terlepas dari tanggalnya.

Steve Jay
sumber
1
Saya tidak yakin tentang menempatkan ini sebagai jawaban, tetapi saya menaruhnya di sini sebagai komentar: yang mengejutkan, saya menemukan bahwa Python menerima perbandingan seperti '23:23:00' > '23:59:00'atau '23:23:00' > '23:09:22', seperti yang akan Anda lakukan antara dua datetime.datetime.now().strftime('%H:%M')nilai. Apakah ini cara terbaik untuk mencapai perbandingan antar waktu? Saya tidak tahu. Apakah itu bekerja? Sejauh yang saya uji, itu berfungsi dengan baik. Tapi yang pasti (dan tentu saja): bukan kesempatan untuk menggunakan ini dengan string datetime yang memiliki bulan, hari kerja.
ivanleoncz

Jawaban:

138

Anda tidak dapat membandingkan waktu tertentu (seperti "sekarang") dengan acara berulang yang tidak tetap (jam 8 pagi terjadi setiap hari).

Anda dapat memeriksa apakah sekarang sebelum atau sesudah jam 8 pagi hari ini :

>>> import datetime
>>> now = datetime.datetime.now()
>>> today8am = now.replace(hour=8, minute=0, second=0, microsecond=0)
>>> now < today8am
True
>>> now == today8am
False
>>> now > today8am
False

sumber
4
Anda mungkin ingin mengubah penerimaan menjadi jawaban Pär Wieslander (dan umumnya harus menunggu beberapa menit lebih lama daripada yang Anda lakukan: P), karena ini sedikit lebih spesifik untuk persis apa yang Anda tanyakan.
69

Anda dapat menggunakan time()metode datetimeobjek untuk mendapatkan waktu, yang dapat Anda gunakan untuk perbandingan tanpa memperhitungkan tanggal:

>>> this_morning = datetime.datetime(2009, 12, 2, 9, 30)
>>> last_night = datetime.datetime(2009, 12, 1, 20, 0)
>>> this_morning.time() < last_night.time()
True
Pär Wieslander
sumber
2
Pastikan untuk melakukannya datetime.datetime.now().time(), jangan lupa tanda kurung di dalamnya now()!
Jose Salvatierra
10

Anda dapat membandingkan objek datetime.datetime secara langsung

Misalnya:

>>> a
datetime.datetime(2009, 12, 2, 10, 24, 34, 198130)
>>> b
datetime.datetime(2009, 12, 2, 10, 24, 36, 910128)
>>> a < b
True
>>> a > b
False
>>> a == a
True
>>> b == b
True
>>> 
Kimvais
sumber
5

Terinspirasi oleh Roger Pate:

import datetime
def todayAt (hr, min=0, sec=0, micros=0):
   now = datetime.datetime.now()
   return now.replace(hour=hr, minute=min, second=sec, microsecond=micros)    

# Usage demo1:
print todayAt (17), todayAt (17, 15)

# Usage demo2:    
timeNow = datetime.datetime.now()
if timeNow < todayAt (13):
   print "Too Early"
AndrewR
sumber
2

Cara lain untuk melakukan ini tanpa menambahkan dependensi atau menggunakan datetime adalah dengan melakukan beberapa penghitungan matematika pada atribut objek waktu. Ini memiliki jam, menit, detik, milidetik, dan zona waktu. Untuk perbandingan yang sangat sederhana, jam dan menit sudah cukup.

d = datetime.utcnow()
t = d.time()
print t.hour,t.minute,t.second

Saya tidak menyarankan melakukan ini kecuali Anda memiliki kasus penggunaan yang sangat sederhana. Untuk apa pun yang membutuhkan kesadaran zona waktu atau kesadaran tanggal, Anda harus menggunakan datetime.

Thomas Dignan
sumber
2

Terkejut saya belum melihat liner yang satu ini di sini:

datetime.datetime.now().hour == 8
Jesse Reza Khorasanee
sumber
2

Anda Dapat Menggunakan Fungsi Timedelta untuk perbandingan peningkatan waktu x.

>>> import datetime 

>>> now = datetime.datetime.now()
>>> after_10_min = now + datetime.timedelta(minutes = 10)
>>> now > after_10_min 

False

Hanya Kombinasi dari jawaban ini Dan Roger

Aryan Vikash
sumber
1

datetime memiliki kemampuan perbandingan

>>> import datetime
>>> import time
>>> a =  datetime.datetime.now()
>>> time.sleep(2.0)
>>> b =  datetime.datetime.now()
>>> print a < b
True
>>> print a == b
False
luc
sumber