Блог Олега Сердюкова

Функция для получения разницы между временами

Достаточно часто мне приходится считать “тайминги”. Например, сервера на AWS создаются N минут, фаза начальной настройки занимает M минут, приложение разворачивается K минут. Можно встраивать эти тайминги в плейбуки/кукбуки/манифесты/скрипты/etc, однако не всегда это применимо. В основном мне хватает вручную зафиксировать время начала и конца фазы, а затем подсчитать разницу.

Вот одна из причин, почему я люблю iTerm (работаю на iTerm2 Version 3) - можно включить метки времени:

и получить:

Время вида “2:25:31 PM” было в давней бете, релиз показывает время согласно локали вида “14:25:31”.

А вот с “подсчитать” быстро не получалось. В уме, конечно, полезно считать, но лень. В Numbers — излишне избыточно. Один взгляд на картинку и всё становится понятно:

Поэтому набросал функцию для автоматизации:

#
# Show difference between times
#
# Parameters:
#   t1, t2 - time
#
# Examples:
#
# time_diff 11:03:44 11:28:38
#   24 min + 54 s
#
# time_diff "Fri Jul 15 01:57:21 EEST 2016" "Fri Jul 15 13:57:21 EEST 2017"
#   1 yr + 6 hr + 11 min + 14.025322 s
#
time_diff () {
  local time1="$1"
  local time2="$2"

  local gnu_prefix=""
  if [[ $OSTYPE != "linux-gnu" ]]; then
    gnu_prefix=g
  fi

  if [[ -z $time1 || -z $time2 ]]; then
    echo "Usage:" >&2
    echo "  time_diff <time1> <time2>" >&2
    echo "" >&2
    echo "Example:" >&2
    echo "  time_diff 11:03:44 11:28:38" >&2
    echo "  time_diff 'Fri Jul 15 01:57:21 EEST 2016' 'Fri Jul 15 13:57:21 EEST 2017'" >&2
    return 1
  fi

  if ! which ${gnu_prefix}date &> /dev/null; then
    echo "${gnu_prefix}date is missing, please run 'brew install coreutils' (for macOS)" >&2
    return 1
  fi

  if ! which ${gnu_prefix}units &> /dev/null; then
    echo "${gnu_prefix}units is missing, please run 'brew install gnu-units' (for macOS) or 'sudo apt-get install units' (for Debian)" >&2
    return 1
  fi

  first_timestamp=$(${gnu_prefix}date -d "$time1" +%s)
  last_timestamp=$(${gnu_prefix}date -d "$time2" +%s)

  if [[ $first_timestamp -gt $last_timestamp ]]; then
    local swap=$first_timestamp
    first_timestamp=$last_timestamp
    last_timestamp=$swap
  fi

  ${gnu_prefix}units "${last_timestamp}sec-${first_timestamp}sec" 'yr;mo;d;hr;min;s'
}

Проверял под macOS и Ubuntu 16.04.

Для macOS нужно установить:

$ brew install coreutils
$ brew install gnu-units

Для Ubuntu/Debian:

$ sudo apt-get install units

Я использую zsh, добавил функцию в ~/.zshrc и вызываю теперь в shell:

$ time_diff 11:03:44 11:28:38
   24 min + 54 s

При желании можно её адаптировать под Alfred.

Comments