¿Cómo comparar dos fechas en un caparazón?

¿Cómo comparar dos fechas en un caparazón?

¿Cómo se pueden comparar dos fechas en un caparazón?

Aquí hay un ejemplo de cómo me gustaría usar esto, aunque no funciona como está:

todate=2013-07-18
cond=2013-07-15

if [ $todate -ge $cond ];
then
    break
fi                           

¿Cómo puedo lograr el resultado deseado?

Respuesta1

Aún falta la respuesta correcta:

todate=$(date -d 2013-07-18 +%s)
cond=$(date -d 2014-08-19 +%s)

if [ $todate -ge $cond ];
then
    break
fi  

Tenga en cuenta que esto requiere la fecha GNU. La sintaxis equivalente datepara BSD date(como la que se encuentra en OSX de forma predeterminada) esdate -j -f "%F" 2014-08-19 +"%s"

Respuesta2

Puede utilizar una comparación de cadenas de estilo ksh para comparar el orden cronológico [de cadenas en formato de año, mes y día].

date_a=2013-07-18
date_b=2013-07-15

if [[ "$date_a" > "$date_b" ]] ;
then
    echo "break"
fi

Afortunadamente, cuando [las cadenas que usan el formato AAAA-MM-DD] se ordenan* en orden alfabético, también se ordenan* en orden cronológico.

(* - ordenado o comparado)

En este caso no se necesita nada sofisticado. ¡Hurra!

Respuesta3

Te falta el formato de fecha para la comparación:

#!/bin/bash

todate=$(date -d 2013-07-18 +"%Y%m%d")  # = 20130718
cond=$(date -d 2013-07-15 +"%Y%m%d")    # = 20130715

if [ $todate -ge $cond ]; #put the loop where you need it
then
 echo 'yes';
fi

También te faltan estructuras en bucle, ¿cómo planeas conseguir más fechas?

Respuesta4

El operador -gesolo funciona con números enteros, que no son sus fechas.

Si su script es bash, ksh o zsh, puede usar el <operador en su lugar. Este operador no está disponible en guión ni en otros shells que no vayan mucho más allá del estándar POSIX.

if [[ $cond < $todate ]]; then break; fi

En cualquier shell, puede convertir las cadenas en números respetando el orden de las fechas simplemente eliminando los guiones.

if [ "$(echo "$todate" | tr -d -)" -ge "$(echo "$cond" | tr -d -)" ]; then break; fi

Alternativamente, puedes volverte tradicional y usar la exprutilidad.

if expr "$todate" ">=" "$cond" > /dev/null; then break; fi

Como la invocación de subprocesos en un bucle puede ser lenta, es posible que prefiera realizar la transformación utilizando construcciones de procesamiento de cadenas de shell.

todate_num=${todate%%-*}${todate#*-}; todate_num=${todate_num%%-*}${todate_num#*-}
cond_num=${cond%%-*}${cond#*-}; cond_num=${cond_num%%-*}${cond_num#*-}
if [ "$todate_num" -ge "$cond_num" ]; then break; fi

Por supuesto, si puedes recuperar las fechas sin los guiones en primer lugar, podrás compararlas con -ge.

información relacionada