Как сравнить две даты?

382

Как бы я сравнил две даты, чтобы увидеть, какая из них позже, с использованием Python?

Например, я хочу проверить, не превышает ли текущая дата последнюю дату в списке, который я создаю, дат праздников, чтобы он автоматически отправлял электронное письмо с указанием администратору обновить файл holiday.txt.

Сесил Родригес
источник
20
Er, можно использовать <и >оператор, так же , как с любым другим сравнением.
Даниэль Роузман
12
@JohnMachin: вы пишете функцию с прототипом int compare_dates(void const *, void const*), приводите оба аргумента struct Date *и реализуете логику сравнения. Это может быть не так очевидно для новичка в Python.
Фред Фу
1
@larsmans: Извините .... s / any_language / any_reasonable_language / и любой, кто привык к неразумному языку, должен потратить несколько минут на изучение документов и проверку даты1 <date2
Джон Мачин
2
docs.python.org/library/datetime.html#datetime-objects Ctrl-F поиск «Поддерживаемые операции»
Джон Мачин
1
@Galaxy - он использует аналогию, чтобы показать, что то, что должно быть простым для опытного человека, может быть непростым для начинающего, и он использует C, чтобы проиллюстрировать это. Он не думает, что вопрос о C. И он был прав, я был абсолютным новичком в то время, когда я задавал этот вопрос почти 8 лет назад, и понятия не имел, как все это работает.
Сесил Родригес

Ответы:

497

Используйте 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? Я не могу понять ваш пример, и его результат не имеет смысла.
Emadpres
19
@Emadpres: представьте, что это было напечатано вручную. Предыдущая строка была напечатана первой, а текущая - второй ... поэтому первая строка была введена первой, поэтому last <present - True.
ramcdougal
2
Цитата из документа: «Если один сопоставление наивно, а другой осведомлен, TypeError вызывается при попытке сравнения порядка. Для сравнений на равенство наивные экземпляры никогда не равны осведомленным экземплярам. Если оба сравнения осведомлены и имеют одинаковые Атрибут tzinfo, общий атрибут tzinfo игнорируется, и сравниваются базовые даты и времени. Если оба сопоставителя осведомлены и имеют разные атрибуты tzinfo, сопоставления сначала корректируются путем вычитания их смещений UTC (полученных из self.utcoffset ()). "
Викас Прасад
2
Имена переменных должны быть pastи past_but_a_little_after. Технически, presentэто также в прошлом, когда проводится сравнение past < present.
грисаит
75

использование time

Допустим, у вас есть начальные даты в виде строк:
date1 = "31/12/2015"
date2 = "01/01/2016"

Вы можете сделать следующее:
newdate1 = time.strptime(date1, "%d/%m/%Y")и newdate2 = time.strptime(date2, "%d/%m/%Y")преобразовать их в формат даты Python. Тогда сравнение очевидно:

newdate1 > newdate2вернется False
newdate1 < newdate2вернетсяTrue

Гильермо Перейра
источник
40

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