Skip to main content

Datum/Zeit-Berechnung

Datum und Zeit-Berechnung und -Manipulation mit BASH-Boardmitteln ist leider sehr mühselig. Das GNU date-Kommando kann uns hier sehr helfen:

Bei allen Beispielen gilt:

DATUM="2009-02-25 10:30:38"

Ein Datum in UNIX-Timestamp umwandeln:

STAMP=`date --utc --date "$DATUM" +%s`

Und wieder zurück:

date --utc --date "1970-01-01 $STAMP sec" "+%Y-%m-%d %T"

Sekunden/Minuten/Stunden/Tage zwischen zwei Daten ausgeben:

dateDiff (){
    case $1 in
        -s)   sec=1;      shift;;
        -m)   sec=60;     shift;;
        -h)   sec=3600;   shift;;
        -d)   sec=86400;  shift;;
        *)    sec=86400;;
    esac
    dte1=$(date2stamp $1)
    dte2=$(date2stamp $2)
    diffSec=$((dte2-dte1))
    if ((diffSec < 0)); then abs=-1; else abs=1; fi
    echo $((diffSec/sec*abs))
}
 
# Beispiel:
# -s in sec. | -m in min. | -h in hours  | -d in days (default)
 dateDiff -s "2006-10-01" "2006-10-32"
 dateDiff -m "2006-10-01" "2006-10-32"
 dateDiff -h "2006-10-01" "2006-10-32"
 dateDiff -d "2006-10-01" "2006-10-32"
 dateDiff  "2006-10-01" "2006-10-32"
 
# number of seconds between two times
 dateDiff -s "17:55" "23:15:07"
 dateDiff -m "17:55" "23:15:07"
 dateDiff -h "17:55" "23:15:07"
 
# number of minutes from now until the end of the year
 dateDiff -m "now" "2006-12-31 24:00:00 CEST"

weitere Standardfeatures von date, die nicht sehr ausführtlich dokumentiert sind:

# add 2 days, one hour and 5 sec to any date
date --date "$DATUM  2 days 1 hour 5 sec"
 
# substract from any date
date --date "$DATUM 3 days 5 hours 10 sec ago"
date --date "$DATUM -3 days -5 hours -10 sec"
 
# or any mix of +/-. What will be the date in 3 months less 5 days
date --date "now +3 months -5 days"
 
# time conversions into ISO-8601 format (RFC-3339 internet recommended format)
date --date "sun oct 1 5:45:02PM" +%FT%T%z
date --iso-8601=seconds --date "sun oct 1 5:45:02PM"
date --iso-8601=minutes
 
# time conversions into RFC-822 format
date --rfc-822 --date "sun oct 1 5:45:02PM"