¿Cómo comparar dos fechas?

381

¿Cómo compararía dos fechas para ver cuál es más tarde, usando Python?

Por ejemplo, quiero verificar si la fecha actual es posterior a la última fecha en esta lista que estoy creando, de fechas de vacaciones, para que envíe un correo electrónico automáticamente, diciéndole al administrador que actualice el archivo holiday.txt.

Cecil Rodriguez
fuente
20
Er, usa los operadores <y >, al igual que con cualquier otra comparación.
Daniel Roseman
12
@ JohnMachin: escribe una función con prototipo int compare_dates(void const *, void const*), emite ambos argumentos struct Date *e implementa la lógica de comparación. Puede que no sea tan obvio para un recién llegado a Python.
Fred Foo
1
@larsmans: Lo siento ... s / any_language / any_reasonable_language / y cualquier persona acostumbrada a un lenguaje irracional debe pasar unos minutos leyendo los documentos y probando date1 <date2
John Machin
2
docs.python.org/library/datetime.html#datetime-objects Ctrl-F buscar "Operaciones compatibles"
John Machin
1
@Galaxy: está usando una analogía para mostrar que lo que debería ser simple para una persona experimentada podría no ser simple para un principiante total y está usando C para ilustrar esto. Él no cree que la pregunta sea sobre C. Y tenía razón, yo era un principiante total cuando hice esta pregunta hace casi 8 años, y no tenía idea de cómo funcionaba.
Cecil Rodriguez

Respuestas:

496

Use el datetimemétodo y el operador <y sus parientes.

>>> 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
fuente
19
Esto también funciona para los valores conscientes de la zona horaria, si alguien se lo preguntaba.
Mat Gessel
2
¿Qué es diferente entre pasty present? No puedo entender tu ejemplo y su resultado no tiene sentido.
Emadpres
19
@Emadpres: imagina que esto se escribió manualmente. La línea pasada se escribió primero, mientras que la línea actual se escribió segunda ... así que la línea pasada se ingresó primero, así que pasado <presente es Verdadero.
ramcdougal
2
Cita del documento: "Si un comparante es ingenuo y el otro es consciente, TypeError se genera si se intenta una comparación de orden. Para las comparaciones de igualdad, las instancias ingenuas nunca son iguales a las instancias conscientes. Si ambos comparados son conscientes y tienen el mismo "atributo tzinfo", se ignora el atributo común tzinfo y se comparan las fechas y horas base. Si ambos comparados son conscientes y tienen diferentes atributos tzinfo, los comparantes se ajustan primero restando sus compensaciones UTC (obtenidas de self.utcoffset ()) ".
Vikas Prasad
2
Los nombres de las variables deben ser pasty past_but_a_little_after. Técnicamente, presenttambién está en el pasado cuando se hace la comparación past < present.
grisaitis
75

Utilizar time

Digamos que tiene las fechas iniciales como cadenas como estas:
date1 = "31/12/2015"
date2 = "01/01/2016"

Puede hacer lo siguiente:
newdate1 = time.strptime(date1, "%d/%m/%Y")y newdate2 = time.strptime(date2, "%d/%m/%Y")convertirlos al formato de fecha de Python. A continuación, la comparación es obvia:

newdate1 > newdate2volverá False
newdate1 < newdate2volveráTrue

Guillermo Pereira
fuente
40

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

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

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

ver los documentos .

Daniel Nill
fuente
3

Otras respuestas usando datetimey comparaciones también funcionan solo por tiempo, sin fecha.

Por ejemplo, para verificar si en este momento es más o menos de las 8:00 am, podemos usar:

import datetime

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

Y luego comparar con:

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

que volverá True

Luis
fuente
-1

Para calcular la diferencia de días en dos fechas, se puede hacer de la siguiente manera:

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 si un segundo es más con la fecha de vencimiento, entonces tenemos que cobrar

Pallavi Sharma
fuente
No responde la pregunta.
Willwsharp