Làm cách nào để kiểm tra xem một ngày có trùng ngày với datetime.today () hay không?


88

Điều kiện này luôn đánh giá Truengay cả khi đó là cùng một ngày vì nó đang so sánh thời gian.

from datetime import datetime

# ...

if date_num_posts < datetime.today(): 

Làm cách nào để kiểm tra xem một ngày có trùng với ngày đó datetime.today()không?

Câu trả lời:


169

Nếu bạn chỉ muốn so sánh ngày tháng,

yourdatetime.date() < datetime.today().date()

Hoặc, rõ ràng,

yourdatetime.date() == datetime.today().date()

Nếu bạn muốn kiểm tra xem chúng có cùng ngày hay không.

Tài liệu này thường hữu ích. Nó cũng thường là kết quả google đầu tiên cho python thing_i_have_a_question_about. Trừ khi câu hỏi của bạn là về một chức năng / mô-đun có tên là "con rắn".

Về cơ bản, datetimemô-đun có ba loại để lưu trữ một thời điểm:

  • date trong năm, tháng, ngày trong tháng
  • time cho giờ, phút, giây, micro giây, thông tin múi giờ
  • datetimekết hợp ngày và giờ. Nó có các phương thức date()time()để lấy các đối tượng datevà tương ứng time, và có một combinechức năng tiện dụng để kết hợp datetimethành một datetime.

2
"Đây cũng thường là kết quả google đầu tiên cho python thing_i_have_a_question_about" Và trừ khi ai đó thực hiện mục nhập SO về chủ đề này, giống như nó đã xảy ra ở đây :)
giảm hoạt động vào

37
  • Nếu bạn chỉ cần so sánh giá trị ngày trong tháng, bạn có thể sử dụng mã sau:

    if yourdate.day == datetime.today().day:
        # do something
    
  • Nếu bạn cần kiểm tra xem sự chênh lệch giữa hai ngày có thể chấp nhận được hay không thì bạn có thể sử dụng tính năng hẹn giờ :

    if (datetime.today() - yourdate).days == 0:
        #do something
    
  • Và nếu bạn chỉ muốn so sánh phần ngày, bạn có thể chỉ cần sử dụng:

    from datetime import datetime, date
    if yourdatetime.date() < datetime.today().date()
        # do something
    

Lưu ý rằng hẹn giờ có định dạng sau:

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

Vì vậy, bạn có thể kiểm tra chênh lệch theo ngày, giây, msec, phút, v.v. tùy thuộc vào những gì bạn thực sự cần:

from datetime import datetime
if (datetime.today() - yourdate).days == 0:
    #do something

Trong trường hợp của bạn, khi bạn cần kiểm tra xem hai ngày có hoàn toàn giống nhau hay không, bạn có thể sử dụng tính năng hẹn giờ (0):

from datetime import datetime, timedelta
if (datetime.today() - yourdate) == timedelta(0):
    #do something

1
.daylà ngày trong tháng. Vì vậy, ngày 12 tháng 8 "bằng" với ngày 12 tháng 12 bằng cách sử dụng đoạn mã đầu tiên của bạn. Đó có lẽ không phải là hành vi mà OP muốn.
trutheality

@trutheality - vâng, tôi bắt đầu viết câu trả lời của tôi trước khi câu hỏi đã được chỉnh sửa, vì vậy tôi đã không thể hiểu được những gì ông biết chính xác cần, đó là lý do tại sao tôi cung cấp một số tùy chọn cho việc này
Artsiom Rudzenka

1
Lưu ý nhanh: các đối tượng datetime có một thuộc tính gọi là 'day' (không có 's') và các đối tượng hẹn giờ có một thuộc tính gọi là 'days' (với một 's') trong trường hợp mọi người bối rối với lý do cú pháp của chúng không hoạt động.
Colton Hicks

3

Bạn có thể đặt giờ, phút, giây và micro giây thành bất kỳ thứ gì bạn muốn

datetime.datetime.today().replace(hour=0, minute=0, second=0, microsecond=0)

nhưng câu trả lời của trutheality có lẽ là tốt nhất khi tất cả chúng đều bằng 0 và bạn chỉ có thể so sánh .date() các thời điểm

Mặc dù vậy, có thể nhanh hơn nếu bạn phải so sánh hàng trăm lịch hẹn ngày vì bạn chỉ cần thực hiện replace()một lần so với hàng trăm cuộc gọi tớidate()


Tôi sẽ bỏ phiếu cho điều này nếu nó không liên quan đến đột biến. Tuy nhiên, bạn có thể điều chỉnh phương pháp này bằng cách tạo bản sao của các đối tượng datetime mà bạn đang so sánh, sau đó sửa đổi chúng bằng cách xóa các trường có độ phân giải phụ ngày, sau đó so sánh các bản sao.
ninjagecko

1
@ninja, nó không đột biến. Replace () trả về một đối tượng datetime mới, giống như str.replace ()
John La Rooy

2
all(getattr(someTime,x)==getattr(today(),x) for x in ['year','month','day'])

Người ta nên so sánh bằng cách sử dụng .date(), nhưng tôi để phương pháp này làm ví dụ trong trường hợp người ta muốn, ví dụ, so sánh mọi thứ theo tháng hoặc theo phút, v.v.

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.