Làm thế nào để so sánh hai ngày?


381

Làm thế nào tôi có thể so sánh hai ngày để xem cái nào muộn hơn, sử dụng Python?

Ví dụ: tôi muốn kiểm tra xem ngày hiện tại có quá ngày cuối cùng trong danh sách này tôi đang tạo không, ngày nghỉ, để nó sẽ tự động gửi email, thông báo cho quản trị viên cập nhật tệp holiday.txt.


20
Er, bạn sử dụng <và các >toán tử, giống như với bất kỳ so sánh khác.
Daniel Roseman

12
@JohnMachin: bạn viết một hàm với nguyên mẫu int compare_dates(void const *, void const*), truyền cả hai đối số struct Date *và thực hiện logic so sánh. Nó có thể không rõ ràng đối với người mới sử dụng Python.
Fred Foo

1
@larsmans: Xin lỗi .... s / any_lingu / any_reasonable_lingu / và bất kỳ ai sử dụng ngôn ngữ không hợp lý nên dành vài phút để đọc các tài liệu và dùng thử date1 <date2
John Machin

2
docs.python.org/l Library / datetime.html#datetime - objects Tìm kiếm Ctrl-F cho "Hoạt động được hỗ trợ"
John Machin

1
@Gal Wax - anh ấy đang sử dụng một phép loại suy, để chỉ ra rằng những gì đơn giản đối với một người dày dạn có thể không đơn giản đối với người mới bắt đầu và anh ấy đang sử dụng C để minh họa điều này. Anh ta không nghĩ câu hỏi là về C. Và anh ta đã đúng, tôi là người mới bắt đầu vào thời điểm tôi hỏi câu hỏi này gần 8 năm trước và không biết nó hoạt động như thế nào.
Cecil Rodriguez

Câu trả lời:


495

Sử dụng datetimephương pháp và toán tử <và họ hàng của nó.

>>> from datetime import datetime, timedelta
>>> past = datetime.now() - timedelta(days=1)
>>> present = datetime.now()
>>> past < present
True
>>> datetime(3000, 1, 1) < present
False
>>> present - datetime(2000, 4, 4)
datetime.timedelta(4242, 75703, 762105)

19
Điều này cũng hoạt động cho các giá trị nhận biết múi giờ, nếu có ai thắc mắc.
Mat G Tàu

2
Có gì khác nhau giữa pastpresent? Tôi không thể hiểu ví dụ của bạn và kết quả của nó không có ý nghĩa.
Emadpres

19
@Emadpres: hãy tưởng tượng điều này đã được gõ bằng tay. Dòng quá khứ được gõ trước, trong khi dòng hiện tại được gõ thứ hai ... vì vậy dòng quá khứ được nhập trước, vì vậy quá khứ <hiện tại là True.
ramcdougal

2
Trích dẫn từ tài liệu: "Nếu một so sánh là ngây thơ và khác so với nhận thức, TypeError được nêu ra nếu cố gắng so sánh thứ tự. Đối với các so sánh bình đẳng, các trường hợp ngây thơ không bao giờ bằng với các trường hợp nhận biết. Thuộc tính tzinfo, thuộc tính tzinfo chung bị bỏ qua và dữ liệu cơ sở được so sánh. Nếu cả hai phép so sánh đều biết và có các thuộc tính tzinfo khác nhau, các phép so sánh trước tiên được điều chỉnh bằng cách trừ đi các độ lệch UTC của chúng (thu được từ self.utcoffset ()). "
Vikas Prasad

2
Tên biến nên pastpast_but_a_little_after. Về mặt kỹ thuật, presentcũng là trong quá khứ khi so sánh past < presentđược thực hiện.
viêm grisa

75

Sử dụng time

Giả sử bạn có ngày ban đầu dưới dạng chuỗi như sau:
date1 = "31/12/2015"
date2 = "01/01/2016"

Bạn có thể làm như sau:
newdate1 = time.strptime(date1, "%d/%m/%Y")newdate2 = time.strptime(date2, "%d/%m/%Y")để chuyển đổi chúng sang định dạng ngày của python. Sau đó, so sánh là rõ ràng:

newdate1 > newdate2sẽ trở lại False
newdate1 < newdate2sẽ trở lạiTrue


40

datetime.date(2011, 1, 1) < datetime.date(2011, 1, 2)sẽ trở lại True.

datetime.date(2011, 1, 1) - datetime.date(2011, 1, 2)sẽ trở lại datetime.timedelta(-1).

datetime.date(2011, 1, 1) + datetime.date(2011, 1, 2) sẽ trở lại datetime.timedelta(1).

xem các tài liệu .


3

Các câu trả lời khác sử dụng datetime và so sánh cũng chỉ hoạt động trong thời gian, không có ngày.

Ví dụ: để kiểm tra xem ngay bây giờ là nhiều hơn hoặc ít hơn 8:00 sáng, chúng ta có thể sử dụng:

import datetime

eight_am = datetime.time( 8,0,0 ) # Time, without a date

Và sau này so sánh với:

datetime.datetime.now().time() > eight_am  

cái nào sẽ trở lại True


-1

Để tính ngày trong hai ngày chênh lệch, có thể được thực hiện như dưới đây:

import datetime
import math

issuedate = datetime(2019,5,9)   #calculate the issue datetime
current_date = datetime.datetime.now() #calculate the current datetime
diff_date = current_date - issuedate #//calculate the date difference with time also
amount = fine  #you want change

if diff_date.total_seconds() > 0.0:   #its matching your condition
    days = math.ceil(diff_date.total_seconds()/86400)  #calculate days (in 
    one day 86400 seconds)
    deductable_amount = round(amount,2)*days #calclulated fine for all days

Trở thành nếu một giây nhiều hơn vào ngày đáo hạn thì chúng ta phải tính phí


Không trả lời câu hỏi.
Willwsharp
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.