Comparaci贸n de fechas y horas en Python: con y sin zonas horarias

    Introducci贸n

    Al trabajar con fechas, a menudo, le gustar铆a saber si una fecha determinada es anterior o posterior a otra fecha. Podemos obtener estas respuestas comparando fechas.

    En este art铆culo, aprenderemos a usar Python datetime m贸dulo para crear y comparar fechas ingenuas (sin informaci贸n de zona horaria) y conscientes (con informaci贸n de zona horaria).

    Para comparar las fechas, usaremos los operadores de comparaci贸n en Python: <, >, ==, <=, >=, !=.

    Nota: los datetime El m贸dulo tiene dos m茅todos para crear objetos de fechas: datetime.datetime y datetime.date. Las comparaciones solo se pueden hacer en objetos creados a partir de la misma clase:

    datetime.datetime.now() >= datetime.date.today()
    

    Esto resultar谩 en una TypeError:

    TypeError: can't compare datetime.datetime to datetime.date
    

    Comparaci贸n de fechas y horas ingenuas de zona horaria

    Comencemos comparando fechas ingenuas, que no tienen informaci贸n de zona horaria. Primero, queremos importar el datetime m贸dulo:

    from datetime import datetime, date
    

    Luego, hagamos algunas fechas que podamos comparar:

    date1 = date(1995, 3, 20)
    date2 = date(2020, 1, 1)
    dob_a = datetime(1995, 3, 20)
    dob_b = datetime(2020, 1, 1)
    

    Comparar estos objetos es tan f谩cil como comparar, digamos, n煤meros enteros. Una fecha es menor que otra, si su tiempo precede al otro.

    En nuestro caso, date1 se considera menos<) que date2 porque est谩 m谩s atr谩s en el tiempo:

    print("date1 comes before date2?", date1 < date2)
    print("date1 comes after date2?", date1 > date2)
    print("date1 is equal to date2?", date1 == date2)
    

    Esto resulta en:

    date1 comes before date2? True
    date1 comes after date2? False
    date1 is equal to date2? False
    

    Ahora, normalmente incorporar铆a esta l贸gica en algunas declaraciones de control de flujo:

    if  dob_a > dob_b:
        print("person a is older than person b")
    else:
        print("person b is older than person a")
    

    Esto resulta en:

    person b is older than person a
    

    Comparaci贸n de fechas y horas conscientes de la zona horaria

    Las zonas horarias pueden complicar un poco las cosas, aunque, afortunadamente, podemos aplicar exactamente la misma l贸gica a la comparaci贸n. La 煤nica diferencia es que estamos trabajando con fechas conocidas, fechas con informaci贸n adicional sobre la zona horaria en la que se encuentran:

    from datetime import datetime
    import pytz
    
    # Create timezone objects for different parts of the world
    tz_ny= pytz.timezone('America/New_York')
    tz_lon = pytz.timezone("Europe/London")
    
    # Year, Month, Day, Hour, Minute, Second
    datetime = datetime(2010, 4, 20, 23, 30, 0)
    
    # Localize the given date, according to the timezone objects
    date_with_timezone_1 = tz_ny.localize(datetime)
    date_with_timezone_2 = tz_lon.localize(datetime)
    
    # These are now, effectively no longer the same *date* after being localized
    print(date_with_timezone_1) # 2010-04-20 23:30:00-04:00
    print(date_with_timezone_2) # 2010-04-20 23:30:00+01:00
    
    print(date_with_timezone_1 == date_with_timezone_2)
    

    Ejecutar este c贸digo da como resultado:

    False
    

    Mientras que esta declaraci贸n:

    print(date_with_timezone_1 > date_with_timezone_2)
    

    Resultar铆a en:

    True
    

    Ahora bien, este resultado puede parecerle un poco extra帽o. Estamos comparando estas dos fechas y horas:

    2010-04-20 23:30:00-04:00 # date_with_timezone_1
    2010-04-20 23:30:00+01:00 # date_with_timezone_2
    

    Intuitivamente, parece date_with_timezone_2 es de hecho m谩s grande que date_with_timezone_1. Sin embargo, echemos un vistazo a c贸mo localize() la funci贸n funciona.

    Aqu铆, hemos utilizado el pytz biblioteca para dar a conocer nuestras citas ingenuas. Hemos construido un objeto de zona horaria para Nueva York (tz_ny) y un objeto de zona horaria para Londres (tz_lon).

    Luego, para inyectar informaci贸n de zona horaria en nuestro datetime objeto, hemos ejecutado el localize() funci贸n y empaquetado el resultado en date_with_timezone_1 y date_with_timezone_2.

    Hemos puesto las 11:30 p.m. en localize(), que a su vez cre贸 una fecha y hora para las 11:30 p. m. en Nueva York y las 11:30 p. m. en Londres, respectivamente. Para llegar de las 11:30 p.m. en Nueva York a las 11:30 p.m. en Londres, tendr铆as que agregar 4 horas. Ha pasado m谩s tiempo para llegar a Nueva York a las 11:30 p. M., Del que tard贸 en llegar a Londres a las 11:30 p. M. Por tanto, la fecha y hora correspondiente a Nueva York a las 11:30 p.m. es mayor que la fecha y hora correspondiente a Londres a las 11:30 p.m.

    Tenga en cuenta este comportamiento cuando trabaje con zonas horarias de esta manera.

    Sin embargo, vale la pena se帽alar que comparar fechas conocidas con fechas ingenuas dar谩 como resultado un error:

    date_with_timezone = tz_ny.localize(datetime)
    print(datetime == date_without_timezone)
    

    Esto resultar谩 en el siguiente error:

    TypeError: can't compare offset-naive and offset-aware datetimes
    

    Entonces, para comparar objetos de fecha y hora, ambos objetos deben ser ingenuos o conscientes.

    Conclusi贸n

    En este art铆culo, hemos discutido las formas de comparar fechas que reconocen la zona horaria y las fechas ingenuas de la zona horaria en Python, tambi茅n hemos analizado los posibles errores que podemos encontrar al comparar fechas y posibles soluciones.

    Si tiene alguna pregunta o contribuci贸n, d茅jela en la secci贸n de comentarios a continuaci贸n.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *