Как найти разницу во времени в секундах между 2 датами в bash?

#bash

#bash

Вопрос:

В настоящее время у меня есть переменные ниже, и я хочу знать, сколько времени прошло в секундах. Итак, CURRENT_TIME — TEST_START

 TEST_START=$(date ' %d/%m/%Y %H:%M:%S')
sleep 4
CURRENT_TIME=$(date ' %d/%m/%Y %H:%M:%S')
  

Я пробовал ниже, но продолжаю получать незаконные действия

 START_IN_SECONDS=$(date --date "$(TEST_START)"  %s)
  

Это в Mac.

Комментарии:

1. Использовать ${variable} не $(variable)

2. $(...) предназначен для выполнения подстановки команд, например, при назначении на TEST_START .

3. я тоже это пробовал

4. Почему вы не можете просто использовать временные метки вместо строк даты? Или, по крайней мере, используйте формат строки даты std.

Ответ №1:

Во-первых, синтаксис для расширения переменных — это $variable or ${variable} , not $(variable) .

Во-вторых, date не знает, как анализировать даты в %d/%m/%Y формате. Когда в дате используются косые черты, ожидается, что это будет %m/%d/%Y . Поэтому измените первые две строки, чтобы использовать правильный формат.

 TEST_START=$(date ' %m/%d/%Y %H:%M:%S')
sleep 4
CURRENT_TIME=$(date ' %m/%d/%Y %H:%M:%S')
START_IN_SECONDS=$(date --date "$TEST_START"  %s)
CURRENT_IN_SECONDS=$(date --date "$CURRENT_TIME"  %s)
diff=$((CURRENT_IN_SECONDS - START_IN_SECONDS))
echo $diff
  

Конечно, вы могли бы просто установить xxx_IN_SECONDS переменные напрямую с помощью %s вместо разбора форматированных дат:

 START_IN_SECONDS=$(date  %s)
sleep 4
CURRENT_IN_SECONDS=$(date  %s)
  

Комментарии:

1. Я получаю «дата: недопустимая опция — -«, я думаю, это может быть потому, что я на Mac

2. На Mac установлен BSD date , вы пытаетесь использовать синтаксис GNU date .

3. В BSD date нет гибкого анализатора дат. Используйте man date , чтобы увидеть его синтаксис.

Ответ №2:

 #!/bin/bash

# Time Arithmetic

TIME1=05:36:11
TIME2=06:46:00

# Convert the times to seconds from the Epoch
SEC1=`date  %s -d ${TIME1}`
SEC2=`date  %s -d ${TIME2}`

# Use expr to do the math, let's say TIME1 was the start and TIME2 was the finish
DIFFSEC=`expr ${SEC2} - ${SEC1}`

echo Start ${TIME1}
echo Finish ${TIME2}

echo Took ${DIFFSEC} seconds.

# And use date to convert the seconds back to something more meaningful
echo Took `date  %H:%M:%S -ud @${DIFFSEC}`
  

Вывод:

 Start 05:36:11
Finish 06:46:00
Took 4189 seconds.
Took 01:09:49
  

Комментарии:

1. Я скопировал и вставил это, и это не работает. Я получаю «дата: недопустимый формат времени».

2. Я думаю, что это может быть проблемой, потому что я использую Mac