2010-08-02 20 views
14

Si hay fechas como 2010-06-01 2010-05-15 y otro comoShell script para obtener la diferencia en dos fechas

Usando shell script o comando date de cómo obtener el número de días entre las dos fechas

gracias ..

+1

'python -c'desde la fecha de importación de fecha y hora; print (fecha (2010, 6, 1) - fecha (2010, 5, 15)). days'' – jfs

Respuesta

14

Utilizando sólo la fecha y la cáscara de la aritmética:

echo $(($(($(date -d "2010-06-01" "+%s") - $(date -d "2010-05-15" "+%s")))/86400)) 
+1

No es necesario usar '$ (())' dos veces. Solo use un conjunto de paréntesis de agrupación: 'echo $ ((($ (date -d" 2010-06-01 "" +% s ") - $ (date -d" 2010-05-15 "" +% s "))/86400)) '(se agregaron espacios opcionales para enfatizar y legibilidad) –

+0

Tenga en cuenta que'% s' es específico de la fecha GNU, por lo que podría no estar disponible en sistemas que no sean Linux. Las [preguntas frecuentes de comp.unix.shell] (http://cfajohnson.com/shell/cus-faq.html # 6) tiene una larga discusión sobre los cálculos de fechas (básicamente, es difícil a menos que tengas una fecha GNU). – Gilles

+0

De hecho, hay un problema mayor: a veces falla en la primavera ... [Mi respuesta explica por qué.] (Http://stackoverflow.com/questions/3385003/shell-script-to-get-difference-in-two-dates/3391111 # 3391111) – Gilles

1

¡gracias

   d1=`date +%s -d $1` 
      d2=`date +%s -d $2` 
      ((diff_sec=d2-d1)) 
     echo - | awk -v SECS=$diff_sec '{printf "Number of days : %d",SECS/(60*60*24)}' 

gracias ..

+3

Si va a usar '(())' también podría usar '$()' de backticks. Además, no hay necesidad de insertar algo en 'awk', solo usa' awk ... 'BEGIN {printf ...}' '. Y realmente no necesita usar 'awk' si solo es matemática entera:' echo "Número de días: $ (((d2 - d1)/(60 * 60 * 24)))' ' –

+0

Gracias ... .............. – Hulk

10

Hay una solución que casi obras: utilizan el formato %s fecha de fecha de GNU, que imprime el número de segundos desde el 1970-01-01 00:00. Se pueden restar para encontrar la diferencia de tiempo entre dos fechas.

echo $((($(date -d 2010-06-01 +%s) - $(date -d 2010-05-15 +%s))/86400)) 

pero las siguientes pantallas 0 en algunos lugares:

echo $((($(date -d 2010-03-29 +%s) - $(date -d 2010-03-28 +%s))/86400)) 

Debido a la hora de verano, hay sólo 23 horas entre aquellos tiempos. Debe agregar al menos una hora (y como máximo 23) para estar seguro.

echo $((($(date -d 2010-03-29 +%s) - $(date -d 2010-03-28 +%s) + 43200)/86400)) 

O se puede decir date a trabajar en una zona horaria y sin horario de verano.

echo $((($(date -u -d 2010-03-29 +%s) - $(date -u -d 2010-03-28 +%s))/86400)) 

(POSIX dice que llamar a la zona horaria de referencia es UTC, pero también dice no contar los segundos intercalares, por lo que el número de segundos en un día es siempre exactamente 86400 en un + xx zona horaria GMT.)

+0

Tu tercer ejemplo arroja '82800' porque has agrupado incorrectamente la expresión y estás realmente agregando' 0' debido a la mayor precedencia de '/', ¿puedes arreglar el error? –

0

fecha Gnu sabe% j para mostrar el día en el año:

echo $(($(date -d 2010-06-01 +%j) - $(date -d 2010-05-15 +%j))) 

cruce años de límites darán resultados erróneos, pero ya que dio fechas fija ...

1

OSX date es diferente a GNU date. Lo conseguí trabajando así en OSX. Esto es solución no portátil.

start_date=$(date -j -f "%Y-%m-%d" "2010-05-15" "+%s") 
end_date=$(date -j -f "%Y-%m-%d" "2010-06-01" "+%s") 

echo $((($end_date - $start_date)/(60 * 60 * 24))) 

La idea sigue siendo la misma que en las otras respuestas. Convierta las fechas al tiempo de época, reste y convierta el resultado a días.

Cuestiones relacionadas