Мне нужно добавить 84 часа к определенной дате начала UTC. Дата начала UTC является текущей датой, а час начала - нет. Приведенный ниже код прекрасно работает до конца месяца, когда он не может преобразоваться в следующий месяц, или до конца года, когда он не может преобразовать годы.
#Date variables
export start_year=$(date -u +%Y)
export start_mon=$(date -u +%m)
export start_monc=${start_mon#0} # strip leading 0
export start_day=$(date -u +%d)
export start_dayc=${start_day#0} # strip leading 0
export start_hour=$fhour # -------THIS IS EITHER 6, 12, 18, or 0
И вот здесь начинаются проблемы:
export end_hour=$(( ($start_dayc*24+84)%24 ))
export end_day=$(( $start_dayc+((($start_dayc*24)+84)/24) ))
export end_mon=$(date -u +%m -d '((($start_dayc*24)+84)/24) days')
export end_year=$(date -u +%Y)
Дополнительная переменная start_monc
предназначена для вычислений, поскольку ведущий ноль создает проблемы. Конечные компоненты должны быть разбиты, как они есть. Моим последним средством является создание серии операторов if для правильного изменения месяца / года.
Какие-либо предложения по решению проблемы конверсии моего месяца / года?
Еще раз спасибо за то, что согласились с моими вопросами, отличный ресурс на этом сайте.
Я сделал бы это:
add_84_hours() {
local datestamp=$1
local start_hour=$2
local epoch=$(date -ud "$datestamp $start_hour:00" +%s)
date -ud "@$(( epoch + 84*3600 ))" +"%Y %_m %e %k"
}
Позволяют нам видеть то, что это возвращает:
$ add_84_hours now 18
2014 2 28 6
$ add_84_hours 2014-02-26 18
2014 3 2 6
$ add_84_hours 2016-02-26 18 # leap year
2016 3 1 6
Для сохранения тех значений к переменным:
read end_year end_month end_day end_hour < <(add_84_hours now 18)
printf "%s\n" "$end_year" "$end_month" "$end_day" "$end_hour"
2014
2
28
6
Если Ваша система имеет функцию даты GNU, должно быть возможно сделать арифметику исходно, например,
date --utc --date="12am today + 84 hours"
date --utc --date="18:00 today + 84 hours"