#!/bin/bash
#-------------------------------------------------------------------------------
# datediff.sh                               (C) 2012-2013 T.Birnthaler OSTC GmbH
# Differenz zweier Datumswerte in Sekunden berechnen
# ($(date +%s) = Anzahl Sekunden seit 1.1.1970 00:00:00).
#-------------------------------------------------------------------------------

# Aufruf
# datediff [-t] DATE1 DATE2
# datediff [-t] DATE1 DATE2 INSEC
function datediff()
{
	TEST=
	[ "$1" = "-t" ] && TEST=1 && shift

	case $# in
		0) echo "ERROR: 2 or 3 arguments needed (sec since 1.1.1970)"
		   return
		   ;;
		1) DIFF="$1"
		   ;;
		2) INSEC=
		   ;;
		3) INSEC=1
		   ;;
		*) echo "ERROR: 2 or 3 arguments needed (sec since 1.1.1970)"
		   return
		   ;;
	esac

	# Differenz in Sekunden berechnen
	DIFF=
	if [ -z "$2" ]
	then
		DIFF="$1"
	elif [ -z "$DIFF" ]
	then
		# Datumswerte falsch herum? -> Vertauschen
		if [ "$1" -gt "$2" ]
		then
			let DIFF="$1-$2"
		else
			let DIFF="$2-$1"
		fi
	fi

	# Differenz umrechnen
	let YY="($DIFF)/(365*3600*24)"
	let DD="($DIFF)%(365*3600*24)/(3600*24)"
	let HH="($DIFF%(3600*24))/3600"
	let MM="($DIFF%3600)/60"
	let SS="$DIFF%60"
	[ "$TEST" ] && echo "$DIFF YY=$YY DD=$DD HH=$HH MM=$MM SS=$SS"

	# Differenzdaten um fuehrende 0er und Jahre + Tage ergaenzen
	[ "$YY" = "0" ]   && YY=""
	[ -n "$YY" ]      && YY="${YY}y "
	[ "$DD" = "0" -a -z "$YY" ] && DD=""
	[ -n "$DD" ]      && DD="${DD}d "
	[ "$HH" -le "9" ] && HH="0$HH"
	[ "$MM" -le "9" ] && MM="0$MM"
	[ "$SS" -le "9" ] && SS="0$SS"

	# Debugausgabe
	if [ "$TEST" ]
	then
		echo "$DIFF YY=$YY DD=$DD HH=$HH MM=$MM SS=$SS"
		[ -z "$2" ] && echo "$1 -> $YY$DD$HH:$MM:$SS $TEXT"
		[ -n "$2" ] && echo -n "$(date -d @$1 +'%d.%m.%Y %T') - "
		[ -n "$2" ] && echo -n "$(date -d @$2 +'%d.%m.%Y %T') -> "
	fi

	# Rueckgabe als HH:MM:SS oder SEC
	if [ -n "$INSEC" ]
	then
		echo "$DIFF"
	else
		echo "$YY$DD$HH:$MM:$SS"
	fi
}

# Option "-t" -> Testen der Funktion
if [ "$1" = "-t" ]
then
	for SEC in "" "sec"
	do
		datediff -t     0 "" $SEC
		datediff -t    59 "" $SEC
		datediff -t    60 "" $SEC
		datediff -t    61 "" $SEC
		datediff -t  3599 "" $SEC
		datediff -t  3600 "" $SEC
		datediff -t  3601 "" $SEC
		datediff -t 86399 "" $SEC
		datediff -t 86400 "" $SEC
		datediff -t 86401 "" $SEC
		datediff -t $(expr 86399 + 3599 + 59) "" $SEC
		datediff -t $(expr 86400 + 3600 + 60)
		datediff -t $(expr 86401 + 3601 + 61)
		datediff -t 0           1000000000  $SEC
		datediff -t 1000000000  0           $SEC
		datediff -t 1234567890  1234567890  $SEC
		datediff -t 1234567890  1234567891  $SEC
		datediff -t 1234567891  1234567890  $SEC
		datediff -t 0           2137483647  $SEC  # 2^31 - 1
		datediff -t 2137483647  0           $SEC  # 2^31 - 1
		datediff -t $(date +%s) $(date +%s) $SEC
		datediff -t $(date +%s) $(date +%s) $SEC
		datediff -t $(date +%s) $(expr $(date +%s) +                     1) $SEC
		datediff -t $(date +%s) $(expr $(date +%s) +                60 + 1) $SEC
		datediff -t $(date +%s) $(expr $(date +%s) +         3600 + 60 + 1) $SEC
		datediff -t $(date +%s) $(expr $(date +%s) + 86400 -             1) $SEC
		datediff -t $(date +%s) $(expr $(date +%s) + 86400                ) $SEC
		datediff -t $(date +%s) $(expr $(date +%s) + 86400 + 3600 + 60 + 1) $SEC
		datediff -t $(date +%s) $(expr $(date +%s) + 2 \* 86400 + 3600 + 60 + 1) $SEC
		datediff -t $(date +%s) $(expr $(date +%s) + 100000000)             $SEC
	done
fi

# Argumente uebergeben -> Aufruf mit uebergebenen Argumenten
if [ $# -gt 0 ]
then
	datediff ${1+"$@"}
fi
