Den
GNU dato kommandoen i fuld af godbidder, men ikke når det kommer til at beregne en dato eller tidspunkt forskel. Her er hvad jeg kom op med efter at have kigget på mere end én løsning.
Koden skal være selvstændig forklare.
Code:
#!/bin/bash
date2stamp () {
date --utc --date "$1" +%s
}
stamp2date (){
date --utc --date "1970-01-01 $1 sec" "+%Y-%m-%d %T"
}
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))
}
# USAGE # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# convert a date into a UNIX timestamp
stamp=$(date2stamp "2006-10-01 15:00")
echo $stamp
# from timestamp to date
stamp2date $stamp
# calculate the number of days between 2 dates
# -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"
# Other standard goodies from GNU date not too well documented in the man pages
# assign a value to the variable dte for the examples below
dte="2006-10-01 06:55:55"
echo $dte
# add 2 days, one hour and 5 sec to any date
date --date "$dte 2 days 1 hour 5 sec"
# substract from any date
date --date "$dte 3 days 5 hours 10 sec ago"
date --date "$dte -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"
Advarsel: ikke-standard format
% s virker måske ikke på alle version af dato. Virker fint for mig
GNU dato 5.2.1