2010-08-02 5 views
14

S'il y a des dates que 2010-06-01 et un autre comme 2010-05-15Shell script pour obtenir la différence en deux dates

Utiliser script shell ou commande date comment obtenir le nombre de jours entre les deux dates

Merci ..

+1

'python -c 'à partir de la date d'importation datetime; print (date (2010, 6, 1) - date (2010, 5, 15)). days'' – jfs

Répondre

14

En utilisant seulement Arithmétique date et shell:

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

Il n'est pas nécessaire d'utiliser '$ (())' deux fois. Utilisez simplement un ensemble de parenthèses de regroupement: 'echo $ ((($ -d" 2010-06-01 "" +% s ") - $ (date -d" 2010-05-15 "" +% s "))/86400)) '(espaces optionnels ajoutés pour l'accentuation et la lisibilité) –

+0

Notez que'% s' est spécifique à la date GNU, il peut donc ne pas être disponible sur les systèmes non Linux. La [FAQ de comp.unix.shell] (http://cfajohnson.com/shell/cus-faq.html # 6) a une longue discussion sur les calculs de date (en gros, c'est dur à moins d'avoir une date GNU). – Gilles

+0

En fait, il y a un plus gros problème: il échoue parfois au printemps ... [Ma réponse explique pourquoi.] (Http://stackoverflow.com/questions/3385003/shell-script-to-get-difference-in-two-dates/3391111 # 3391111) – Gilles

1

Got it

   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)}' 

merci ..

+3

Si vous utilisez '(())', vous pouvez également utiliser '$()' à la place des backticks. De plus, il n'y a pas besoin de mettre quelque chose dans 'awk', il suffit d'utiliser' awk ... 'BEGIN {printf ...}' '. Et vous n'avez pas vraiment besoin d'utiliser 'awk' si c'est juste maths entiers:' echo "Nombre de jours: $ (((d2 - d1)/(60 * 60 * 24)))" ' –

+0

Merci ... .............. – Hulk

10

Il y a une solution qui presque œuvres: utiliser le format de date %s de la date GNU, qui imprime le nombre de secondes écoulées depuis le 1970-01-01 00:00. Ceux-ci peuvent être soustraits pour trouver la différence de temps entre deux dates.

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

Mais les écrans suivants 0 dans certains endroits:

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

En raison du temps d'épargne de lumière du jour, il y a seulement 23 heures entre ces temps. Vous devez ajouter au moins une heure (et au plus 23) pour être en sécurité.

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

Ou vous pouvez dire date travailler dans un fuseau horaire sans l'heure d'été.

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

(Posix dit d'appeler le fuseau horaire de référence est UTC, mais il dit aussi de ne pas compter les secondes sautées, de sorte que le nombre de secondes dans une journée est toujours exactement 86400 dans un GMT + xx fuseau horaire.)

+0

Votre troisième exemple donne réellement '82800' parce que vous avez mal groupé l'expression et que vous ajoutez réellement' 0' en raison de la plus haute priorité de '/', pouvez-vous corriger la faute de frappe? –

0

jour Gnu sait% j pour afficher le jour de l'année:

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

année-limites de passage donneront des résultats erronés, mais étant donné que vous avez donné les dates fixes ...

1

OSX date est différent de GNU date. Je l'ai eu comme ça dans OSX. Ceci est solution non portable.

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))) 

L'idée est toujours la même que dans les autres réponses. Convertir les dates en temps, soustraire et convertir le résultat en jours.

Questions connexes