Добавление часов к произвольной неформатированной дате

Мне нужно добавить 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 для правильного изменения месяца / года.

Какие-либо предложения по решению проблемы конверсии моего месяца / года?

Еще раз спасибо за то, что согласились с моими вопросами, отличный ресурс на этом сайте.

1
задан 13.05.2020, 10:58

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
0
ответ дан 13.05.2020, 10:59

Если Ваша система имеет функцию даты GNU, должно быть возможно сделать арифметику исходно, например,

date --utc --date="12am today + 84 hours"

date --utc --date="18:00 today + 84 hours"
2
ответ дан 13.05.2020, 10:59

Теги

Похожие вопросы