Як порівняти дві дати?


379

Як би я порівняв дві дати, щоб побачити пізніше, використовуючи Python?

Наприклад, я хочу перевірити, чи поточна дата минула останньої дати у цьому списку, який я створюю, відпусток, щоб вона автоматично надіслала електронний лист, повідомивши адміністратору оновити файл Holiday.txt.


20
Так, ви використовуєте оператори <та >оператори, як і будь-яке інше порівняння.
Даніель Роузман

12
@JohnMachin: ви пишете функцію з прототипом int compare_dates(void const *, void const*), передаєте обидва аргументи struct Date *та застосовуєте логіку порівняння. Це може бути не очевидно для новачка Python.
Фред Фоо

1
@larsmans: Вибачте .... s / any_language / any_reasonable_language / і кожен, хто звик до нерозумної мови, повинен витратити кілька хвилин на перегляд документів і випробування date1 <date2
John Machin

2
docs.python.org/library/datetime.html#datetime-objects Ctrl-F шукати "Підтримувані операції"
John Machin

1
@Galaxy - він використовує аналогію, щоб показати, що те, що має бути простим досвідченому людині, може не бути простим для початківця, і він використовує C, щоб проілюструвати це. Він не вважає, що питання стосується C. І він мав рацію, я був тотальним початківцем у той час, коли я задавав це питання майже 8 років тому, і не мав поняття, як це працює.
Сесіль Родрігес

Відповіді:


494

Використовуйте datetimeметод і оператора, <і його родичів.

>>> 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
Це працює і для значень часового поясу, якщо хтось цікавився.
Мат Гессел

2
Що між pastі present? Я не можу зрозуміти ваш приклад, і його результат не має сенсу.
Емадпрес

19
@Emadpres: уявіть, що це було введено вручну. Минулий рядок було введено першим, тоді як теперішній рядок було введено другим ... тому минулий рядок було введено першим, тому минуле <теперішній є Істинним.
ramcdougal

2
Цитуючи з документа: "Якщо один компаранд є наївним, а інший обізнаний, TypeError піднімається при спробі порівняння замовлень. Для порівняння рівності, наївні екземпляри ніколи не дорівнюють відомим екземплярам. Якщо обидва порівнянні знають, і мають однакове атрибут tzinfo, загальний атрибут tzinfo ігнорується та порівнюються базові дати дат. Якщо обидва порівнянні відомі та мають різні атрибути tzinfo, порівняння спочатку коригують, віднімаючи їхні компенсації UTC (отримані з self.utcoffset ()). "
Вікас Прасад

2
Імена змінних повинні бути pastі past_but_a_little_after. Технічно presentце також є в минулому, коли проводиться порівняння past < present.
грисаїт

74

Використовуйте time

Скажімо, у вас є початкові дати у вигляді рядків:
date1 = "31/12/2015"
date2 = "01/01/2016"

Можна зробити наступне:
newdate1 = time.strptime(date1, "%d/%m/%Y")і newdate2 = time.strptime(date2, "%d/%m/%Y")перетворити їх у формат дати пітона. Тоді порівняння очевидно:

newdate1 > newdate2повернеться False
newdate1 < newdate2, повернетьсяTrue


39

datetime.date(2011, 1, 1) < datetime.date(2011, 1, 2)повернеться True.

datetime.date(2011, 1, 1) - datetime.date(2011, 1, 2)повернеться datetime.timedelta(-1).

datetime.date(2011, 1, 1) + datetime.date(2011, 1, 2)повернеться datetime.timedelta(1).

дивись документи .


3

Інші відповіді, використовуючи datetime та порівнянням також працюють лише час, без дати.

Наприклад, щоб перевірити, чи зараз він більше або менше 8:00, ми можемо скористатися:

import datetime

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

А пізніше порівняйте з:

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

який повернеться True


-1

Для підрахунку днів у двох різницях дат можна зробити так:

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

Тому що на одну секунду більше з терміном платежу, ми повинні стягувати плату


Не відповідає на запитання.
Willwsharp
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.