Làm thế nào để so sánh thời gian trong Python?


98

Tôi thấy rằng việc so sánh ngày tháng có thể được thực hiện và cũng có thể thực hiện được datetime.timedelta(), nhưng tôi đang đấu tranh để tìm cách kiểm tra xem thời gian hiện tại ( datetime.datetime.now()) có sớm hơn, muộn hơn hay trùng với thời gian cụ thể (ví dụ: 8 giờ sáng) bất kể ngày nào hay không.


1
Tôi không chắc về việc đặt điều này như một câu trả lời, nhưng tôi đặt nó ở đây như một nhận xét: đáng ngạc nhiên, tôi thấy rằng Python chấp nhận các so sánh như '23:23:00' > '23:59:00'hoặc '23:23:00' > '23:09:22', giống như bạn sẽ làm giữa hai datetime.datetime.now().strftime('%H:%M')giá trị. Đó có phải là cách tốt nhất để đạt được sự so sánh giữa các thời điểm? Tôi không biết. Nó có hoạt động không? Theo như tôi đã thử nghiệm, nó hoạt động tốt. Nhưng chắc chắn (và tất nhiên): không có cơ hội sử dụng điều này với chuỗi ngày giờ có tháng, ngày trong tuần.
ivanleoncz

Câu trả lời:


128

Bạn không thể so sánh một thời điểm cụ thể (chẳng hạn như "ngay bây giờ") với một sự kiện lặp lại, không cố định (8 giờ sáng diễn ra hàng ngày).

Bạn có thể kiểm tra xem bây giờ là trước hay sau 8 giờ sáng hôm nay :

>>> 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

4
Bạn có thể muốn chuyển sự chấp nhận sang câu trả lời của Pär Wieslander (và nói chung là nên đợi thêm vài phút so với bạn đã làm: P), vì nó cụ thể hơn một chút so với chính xác những gì bạn yêu cầu.

65

Bạn có thể sử dụng time()phương pháp datetimeđối tượng để lấy thời gian trong ngày, bạn có thể sử dụng phương pháp này để so sánh mà không cần tính đến ngày tháng:

>>> 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

2
Hãy chắc chắn để làm datetime.datetime.now().time(), đừng quên dấu ngoặc trong now()!
Jose Salvatierra

10

Bạn có thể so sánh các đối tượng datetime.datetime trực tiếp

Ví dụ:

>>> 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
>>> 

4

Lấy cảm hứng từ 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"

2

Một cách khác để làm điều này mà không cần thêm các phụ thuộc hoặc sử dụng datetime là chỉ cần thực hiện một số phép toán trên các thuộc tính của đối tượng thời gian. Nó có giờ, phút, giây, mili giây và múi giờ. Đối với những so sánh rất đơn giản, giờ và phút phải là đủ.

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

Tôi không khuyên bạn nên làm điều này trừ khi bạn có một trường hợp sử dụng cực kỳ đơn giản. Đối với bất kỳ thứ gì yêu cầu nhận biết múi giờ hoặc nhận biết ngày, bạn nên sử dụng datetime.


1

datetime có khả năng so sánh

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

1

Ngạc nhiên là tôi đã không nhìn thấy một lớp lót này ở đây:

datetime.datetime.now().hour == 8

1

Bạn có thể sử dụng Timedelta fuction để so sánh tăng thời gian x.

>>> import datetime 

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

False

Chỉ là sự kết hợp của những câu trả lời nàyRoger

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.