Вычислить сумму даты

Используя только мощность bash, это лучшее, что я нашел до сих пор:

varnums=$(echo ${var//[^0-9]/ })
var_version=${varnums// /.}
echo $varversion 

Результат будет примерно таким:

1.2.6.6.17.686

Не так уж плохо, не так ли?

1
06.07.2016, 07:08
2 ответа

Гораздо проще измерить время в секундах, начиная с эпохи ( +% s ). Затем прошедшее время в секундах получается путем простого вычитания и преобразования из секунд в Минуту просто нужно разделить на 60:

export etool_start=$(date +"%s")
do_stuff_with_etool
export etool_stop=$(date +"%s")
echo "elapsed time=$(( (etool_stop - etool_start)/60 )) minutes"

Если вам действительно нужно время в человеческой форме, вы можете преобразовать их. Использование GNU date :

$ date -d "@$etool_start"
Tue Jul  5 21:30:19 PDT 2016

Или:

$ date -d "@$etool_start"  "+%Y%m%d%H%M"
201607052130

Подробнее о форматировании

Чтобы выразить прошедшее время в минутах в различных форматах, мы можем использовать printf . Например, чтобы получить истекшее время с четырьмя цифрами, мы можем использовать формат % 04i :

$ printf '%04i\n' "$(( ($etool_stop - $etool_start)/60 ))" 
0001

Формат % 4i даст нам целое число (i) в четырех символы. Если нам нужны ведущие нули вместо ведущих пробелов, мы используем % 04i .

Если нам нужен противоположный знак для числа:

$ printf '%05i\n' "$(( ($etool_start - $etool_stop)/60 ))" 
-0035

Поскольку для знака минус требуется дополнительный символ, мы увеличили выделенное пространство с 4 до 5: % 05i .

Больше разрешения

Поскольку в приведенном выше примере использовалась арифметика bash, которая является только целочисленной. Если вы хотите, чтобы истекшее время в минутах с долями минуты, можно использовать другой инструмент, например bc :

$ echo "($etool_stop - $etool_start)/60" | bc -l
1.38333333333333333333

Сколько секунд прошло с начала эпохи?

Из man date ], секунды с начала эпохи определяются следующим образом:

% s
секунд с 1970-01-01 00:00:00 UTC

Поскольку это определено таким образом, местный часовой пояс не имеет значения. Следовательно, вычисление его в "местном часовом поясе" или во всемирном времени, -u , не имеет значения:

$ date +%s; date -u +%s
1467780345
1467780345
2
27.01.2020, 23:35

В bash:

$ export etool_starting=`date -u +"%s"`  
$ export etool_ending=`date -u +"%s"`

Если только необходимы минуты:

$ printf '%05d\n' "$(( (etool_starting - etool_ending) / 60 ))"
-0120       ### If 120 minutes have elapsed in between.
0
27.01.2020, 23:35

Теги

Похожие вопросы