Добавление часов к произвольной неформатированной дате
Мне нужно добавить 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, чтобы соответствующим образом изменить месяц / год.
Любые предложения, чтобы исправить мою проблему преобразования месяца / года?
Еще раз спасибо за то, что согласились с моими вопросами, отличный ресурс на этом сайте.
2 ответа
Я бы сделал это:
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"