2012-01-25 28 views
12

Esattamente come la domanda suona. Voglio sottrarre dire 20120115 dal 20120203 e ottenere 19 come risposta. Qual è il modo migliore per implementarlo in uno script di shell?Come faccio a ottenere la differenza tra due date sotto bash

+0

Possibili assegno duplicato questa domanda: http://stackoverflow.com/questions/4946785/how-to-find-difference-days-between-to-dates –

+0

Hai considerato un altro linguaggio di scripting quello supporta le date intrinsecamente? (python, ruby, perl, ... in nessun ordine particolare), Inoltre potresti usare uno script onliner nella tua fonte bash. – schoetbi

+0

@schoetbi Ci ho pensato, ma non ero molto sicuro di quella disponibilità ovunque. So che bash basico e la data sono disponibili in tutti i punti di interesse, ma non per il resto. – owagh

risposta

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

Come mai la data ha riconosciuto che la stringa è nel formato AAAAMMGG? Per favore, indirizzami alla documentazione. –

+0

man 1 date dice "The --date = STRING è una stringa di data leggibile leggibile in formato libero" –

+0

Cosa succede se la stringa è 03022012? Si noti che ho modificato il formato in GGMMAAAAA. –

0

Una soluzione rapida e del tutto sporco che può essere utilizzato negli script (veloci e anche veloci):

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

Io uso questa funzione per altri scopi relativi ai file di log. E per contare i giorni:

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

YYYYmmdd devono essere date, ovviamente. Funziona solo se $ 1 è una data precedente a $ 2 ed è lento per grandi differenze di date, ma per un periodo di alcuni anni e per essere utilizzato in script ad-hoc è abbastanza utile.

E se vi capita di avere mysql o simili installato v'è un molto veloce opzione:

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

L'ultima tr permette di inserire le date in qualsiasi ordine (MySQL sarebbe altrimenti rendere un '-'if la prima data è anteriore al secondo)

Problemi correlati