2012-01-25 32 views
12

Exactamente como suena la pregunta. Quiero restar decir 20120115 de 20120203 y obtener 19 como respuesta. ¿Cuál es la mejor manera de implementar esto en un script de shell?¿Cómo puedo obtener la diferencia entre dos fechas bajo bash

+0

Posible comprobación de duplicados a esta pregunta: http://stackoverflow.com/questions/4946785/how-to-find-difference-days-between-to-dates –

+0

¿Has considerado otro lenguaje de scripting que admite fechas inherentemente? (python, ruby, perl, ... sin ningún orden en particular), también podría usar un script onliner en su fuente bash. – schoetbi

+0

@schoetbi Pensé en eso pero no estaba muy seguro de esa disponibilidad en todas partes. Sé que bash y date básicos están disponibles en todos los puntos de interés, pero no en el resto. – owagh

Respuesta

24
let DIFF=(`date +%s -d 20120203`-`date +%s -d 20120115`)/86400 
echo $DIFF 
+0

¿Cómo es que date date reconoció que la cadena está en el formato AAAAMMDD? Por favor dirígeme a la documentación. –

+0

man 1 fecha dice "The --date = STRING es una cadena de fecha legible por humanos en formato libre" –

+0

¿Qué pasa si la cadena es 03022012? Tenga en cuenta que he cambiado el formato a DDMMYYYY. –

0

Una solución rápida y completamente sucia que se puede utilizar en scripts (rápidos y rápidos):

function getdate { for dd in $(seq -w $1 $2) ; do date -d $dd +%Y%m%d 2>/dev/null ; done ; }                    

que utilice esta función para otros fines relacionados con los archivos de registro. Y para contar los días:

echo "$(getdate YYYYmmdd YYYYmmdd)" | wc -l 

YYYYmmdd tienen que ser fechas, por supuesto. Solo funciona si $ 1 es una fecha anterior a $ 2 y es lenta para grandes diferencias de fecha, pero durante un período de algunos años y para ser utilizado en scripts ad-hoc, es bastante útil.

Y si le sucede que tiene MySQL o similar instalado no es una opción muy rápida:

mysql -BNe "SELECT DATEDIFF($1,$2) AS DiffDate ;" | tr -d - 

La última tr le permite introducir la fecha en cualquier orden (MySQL sería otra cosa hacer un '-'if la primera fecha es anterior a la segunda)

Cuestiones relacionadas