Como comparar duas datas?

381

Como eu compararia duas datas para ver qual é mais tarde, usando Python?

Por exemplo, quero verificar se a data atual passou da última data nesta lista que estou criando, de datas de feriados, para que ele envie um email automaticamente, informando ao administrador para atualizar o arquivo holiday.txt.

Cecil Rodriguez
fonte
20
Você usa os operadores <e >, como em qualquer outra comparação.
Daniel Roseman
12
@ JohnMachin: você escreve uma função com protótipo int compare_dates(void const *, void const*), lança os dois argumentos struct Date *e implementa a lógica de comparação. Pode não ser tão óbvio para um iniciante em Python.
Fred Foo
11
@larsmans: Desculpe .... s / any_language / any_reasonable_language / e qualquer um acostumado a uma linguagem razoável deve passar alguns minutos folheando os docs e experimentar date1 <date2
John Machin
2
docs.python.org/library/datetime.html#datetime-objects Ctrl-F pesquisa por "Operações suportadas"
John Machin
11
@ Galaxy - ele está usando uma analogia para mostrar que o que deve ser simples para uma pessoa experiente pode não ser simples para um iniciante total e ele está usando C para ilustrar isso. Ele não acha que a pergunta é sobre C. E ele estava certo, eu era totalmente iniciante na época em que fiz essa pergunta há quase 8 anos e não fazia ideia de como isso funcionava.
Cecil Rodriguez

Respostas:

496

Use o datetimemétodo, o operador <e seus parentes.

>>> 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)
Fred Foo
fonte
19
Isso funciona também para valores com reconhecimento de fuso horário, se alguém estava se perguntando.
Mat Gessel
2
O que há de diferente entre paste present? Não consigo entender o seu exemplo e o resultado não faz sentido.
Emadpres
19
@ Emadpres: imagine que isso foi digitado manualmente. A linha passada foi digitada primeiro, enquanto a linha atual foi digitada em segundo ... então a linha passada foi inserida primeiro, então <presente é verdadeiro.
ramcdougal
2
Citando o documento: "Se um comparando é ingênuo e o outro está ciente, TypeError é gerado se uma tentativa de comparação de pedidos. Para comparações de igualdade, instâncias ingênuas nunca são iguais a instâncias cientes. Se ambos os comparandos estão cientes e têm o mesmo atributo tzinfo, o atributo tzinfo comum é ignorado e as datas base são comparadas. Se ambos os comparandos estiverem cientes e tiverem diferentes atributos tzinfo, os comparandos serão ajustados primeiro subtraindo seus deslocamentos UTC (obtidos de self.utcoffset ()). "
Vikas Prasad
2
Os nomes das variáveis ​​devem ser paste past_but_a_little_after. Tecnicamente, presenttambém está no passado quando a comparação past < presenté feita.
Grisaitis #
75

Usar time

Digamos que você tenha as datas iniciais como strings como estas:
date1 = "31/12/2015"
date2 = "01/01/2016"

Você pode fazer o seguinte:
newdate1 = time.strptime(date1, "%d/%m/%Y")e newdate2 = time.strptime(date2, "%d/%m/%Y")convertê-los para o formato de data do python. Então, a comparação é óbvia:

newdate1 > newdate2retornará False
newdate1 < newdate2retornaráTrue

Guillermo Pereira
fonte
40

datetime.date(2011, 1, 1) < datetime.date(2011, 1, 2)retornará True.

datetime.date(2011, 1, 1) - datetime.date(2011, 1, 2)retornará datetime.timedelta(-1).

datetime.date(2011, 1, 1) + datetime.date(2011, 1, 2)retornará datetime.timedelta(1).

veja os documentos .

Daniel Nill
fonte
3

Outras respostas, usando datetimee comparações, também funcionam por tempo, sem data.

Por exemplo, para verificar se agora é mais ou menos do que 8:00 da manhã, podemos usar:

import datetime

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

E depois compare com:

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

que retornará True

Luis
fonte
-1

Para calcular dias em duas datas de diferença, pode ser feito como abaixo:

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

Porque se um segundo é mais com a data de vencimento, temos que cobrar

Pallavi Sharma
fonte
Não responde a pergunta.
Willwsharp em