Разница во времени между указанными двумя датами в секундах - PullRequest
0 голосов
/ 09 января 2019

У меня есть две даты:

2019-01-06 00:02:10 | END
2019-01-05 23:52:00 | START

Как рассчитать и распечатать разницу между датами начала и окончания в секундах?

В вышеприведенном случае я хотел бы получить что-то вроде:

610

Ответы [ 5 ]

0 голосов
/ 27 января 2019

Пытался решить ту же проблему на не-GNU OS, то есть macOS. Я не смог применить ни одно из указанных выше решений, хотя это вдохновило меня на разработку следующего решения. Я использую встроенный Ruby из моего скрипта оболочки, который должен работать из коробки на macOS.

START="2019-01-05 23:52:00"
END="2019-01-06 00:02:10"

SECONDS=$(ruby << RUBY
require 'date'
puts ((DateTime.parse('${END}') - DateTime.parse('${START}')) * 60 * 60 * 24).to_i
RUBY)

echo ${SECONDS}
# 610
0 голосов
/ 09 января 2019
START="2019-01-05 23:52:00"
END="2019-01-06 00:02:10"
parse () {
    local data=(`grep -oP '\d+' <<< "$1"`)
    local y=$((${data[0]}*12*30*24*60*60))
    local m=$((${data[1]}*30*24*60*60))
    local d=$((${data[2]}*24*60*60))
    local h=$((${data[3]}*60*60))
    local mm=$((${data[4]}*60))
    echo $((y+m+d+h+mm+${data[5]}))
}
START=$(parse "$START")
END=$(parse "$END")
echo $((END-START)) // OUTPUT: 610
0 голосов
/ 09 января 2019

Предполагая GNU ОС, основанную на реализации, вы можете использовать опции date %s и -d для вычисления разницы во времени в seconds с использованием подстановки команд и арифметических операций.

START="2019-01-05 23:52:00"
END="2019-01-06 00:02:10"

Time_diff_in_secs=$(($(date -d "$END" +%s) - $(date -d "$START" +%s)))
echo $Time_diff_in_secs

Выход:

610

Надеюсь, это поможет !!!

0 голосов
/ 09 января 2019

То, что вы просите, - это трудность грани невозможного с использованием чистого bash. Bash не имеет собственных функций даты. Для обработки даты большинство рекомендаций, которые вы получите, будет использовать команду date вашей операционной системы, но использование этой команды зависит от операционной системы.

В BSD (включая macOS):

start="2019-01-05 23:52:00"; end="2019-01-06 00:02:10"
printf '%d\n' $(( $(date -j -f '%F %T' "$end" '+%s') - $(date -j -f '%F %T' "$start" '+%s') ))

В Linux или что-либо, использующее дату GNU (возможно, также Cygwin):

printf '%d\n' $(( $(date -d "$end" '+%s') - $(date -d "$start" '+%s') ))

И просто для удовольствия, если вы не можете (или предпочли бы не использовать) по какой-то причине date, возможно, вам удастся избежать неприятностей с gawk:

gawk 'END{ print mktime(gensub(/[^0-9]/," ","g",end)) - mktime(gensub(/[^0-9]/," ","g",start)) }' start="$start" end="$end" /dev/null

Опция mktime() анализирует строку даты практически в том формате, который вы предоставляете, что упрощает математику.

0 голосов
/ 09 января 2019

С датой bash и GNU:

while read d t x x; do
  [[ $x == "END" ]] && end="$d $t" 
  [[ $x == "START" ]] && start="$d $t"
done < file

end=$(date -u -d "$end" '+%s')
start=$(date -u -d "$start" '+%s')

diff=$(($end-$start))
echo "$diff"

Выход:

610

См .: man date

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...