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 *