Korn Shell: показать прошедшее время в определенном формате

В файле журнала мне нужно напечатать время Истекшее в следующем формате:

"Process completed %s - Elapsed %s", <time now in HH:MM:SS format>, <difference from start date to end date in HH:MM:SS format> 

Пример:

 Process completed 23:57:59 - Elapsed 103:22:59 

Как я мог это достичь?

Ksh имеет специальный параметр SECONDS который всегда содержит количество секунд с эпохи. Оценка $SECONDS в начале и в конце задания дает вам время начала и окончания, а разница – прошедшее время.

Время Unix не учитывает секунды прыжка: день в Unix-времени всегда ровно 84000 секунд. Поэтому временная арифметика по времени Unix проста.

 start=$SECONDS … end=$SECONDS elapsed=$((end - start)) printf 'Process completed %d:%02d:%02d - Elapsed %d:%02d:%02d\n' \ $((end / 3600)) $((end / 60 % 60)) $((end % 60)) \ $((elapsed / 3600)) $((elapsed / 60 % 60)) $((elapsed % 60)) 

Нравится это ( Предупреждение : чувствительный настрой теперь отводится сейчас – это старая школа ksh):

 t1=`date '+%H:%M:%S'` sleep 2 t2=`date '+%H:%M:%S'` t1h=`expr $t1 : '\(..\):.*'` t2h=`expr $t2 : '\(..\):.*'` t1m=`expr $t1 : '..:\(..\).*'` t2m=`expr $t2 : '..:\(..\).*'` t1s=`expr $t1 : '..:..:\(..\)'` t2s=`expr $t2 : '..:..:\(..\)'` hdiff=`expr $t2h - $t1h` mdiff=`expr $t2m - $t1m` sdiff=`expr $t2s - $t1s` if [ $tm1 -gt $tm2 ];then hdiff=`expr $hdiff - 1` mdiff=`expr $tm1 - $tm2` fi if [ $ts1 -gt $ts2 ];then mdiff=`expr $mdiff - 1` sdiff=`expr $sm1 - $sm2` fi if [ $hdiff -lt 10 ];then hdiff="0$hdiff" fi if [ $mdiff -lt 10 ];then mdiff="0$mdiff" fi if [ $sdiff -lt 10 ];then sdiff="0$sdiff" fi echo "Elapsed time $hdiff:$mdiff:$sdiff" 

Извините, это для bash, не заметили, что вы хотели оболочку korn до сих пор, я не могу с этим поделать, но это может дать вам основной принцип.

 StartTime=$( date +"%s" ) # do some stuff sleep 4 EndTime=$( date ) ElapsedSecs=$(( `date -d"$EndTime" +%s` - StartTime )) secs=$(( ElapsedSecs % 60 )) mins=$(( ( ElapsedSecs / 60 ) % 60 )) hrs=$(( ElapsedSecs / 3600 )) EndTimeFormated=$( date -d"$EndTime" +"%H:%M:%S" ) echo "Process completed $EndTimeFormated - Elapsed " `printf "%02d:%02d%02d\n" $hrs $mins $secs`