ответ camh позаботится о большей части этого, но мы можем улучшить работу с округлением, часовыми поясами и т. д., плюс мы получим дополнительную точность и возможность выбирать наши единицы измерения:
datediff() {
#convert dates to decimal seconds since 1970-01-01 00:00:00 UTC
date1seconds=$(date +%s.%N -d "$date1")
date2seconds=$(date +%s.%N -d "$date2")
#Calculate time difference in various time units
timeseconds=$(printf "%0.8f\n" $(bc <<<"scale=9; ($date2sec-$date1sec)"))
timeminutes=$(printf "%0.8f\n" $(bc <<<"scale=9; ($date2sec-$date1sec)/60"))
timehours=$(printf "%0.8f\n" $(bc <<<"scale=9; ($date2sec-$date1sec)/3600"))
timedays=$(printf "%0.8f\n" $(bc <<<"scale=9; ($date2sec-$date1sec)/86400"))
timeweeks=$(printf "%0.8f\n" $(bc <<<"scale=9; ($date2sec-$date1sec)/604800"))
}
-d
сообщает date
, что мы предоставляем дату -время для преобразования. +%s.%N
изменяет дату -время на секунды.наносекунды с 1970 -01 -01 00 :00 :00 UTC. bc
вычисляет разницу между двумя числами, и коэффициент деления дает нам разные единицы измерения. printf
добавляет 0 перед запятой, если это необходимо(bc
не делает )и обеспечивает округление до ближайшего(bc
просто усекает ). Вы также можете использовать awk
.
А теперь давайте проверим это на необычном тестовом примере,
date1='Tue Jul 9 10:18:04.031 PST 2020'
date2='Wed May 8 15:19:34.447 CDT 2019'
datediff "$date1" "$date2"
echo $timeseconds seconds
-36971909.584000000 seconds
echo $timeminutes minutes
-616198.493066667 minutes
echo $timehours hours
-10269.974884444 hours
echo $timedays days
-427.915620185 days
echo $timeweeks weeks
-61.130802884 weeks
Обратите внимание, что, поскольку продолжительность месяца или года не всегда одинакова, здесь нет ни одного «правильного» ответа, хотя в настоящее время можно использовать 365,24 дня в качестве разумного приближения.
Проблема заключалась в том, что ~тильда не расширялась в оболочке, указание полного пути сработало.