Adicionando horas a uma data arbitrária e não formatada

1

Eu preciso adicionar 84 horas a uma data UTC inicial específica. A data inicial do UTC é a data atual, mas a hora inicial não é. O código abaixo funciona muito bem até o final do mês, quando não pode ser convertido para o próximo mês ou para o final do ano, quando não for possível converter anos.

#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

E aqui é onde os problemas começam a aparecer:

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)

A variável extra start_monc é para cálculo, pois o zero inicial cria problemas. Os componentes finais precisam ser divididos como estão. Meu último recurso é criar uma série de declarações if para alterar o mês / ano apropriadamente.

Alguma sugestão para corrigir meu problema de conversão de mês / ano?

Obrigado mais uma vez por responder às minhas perguntas, excelente recurso neste site.

    
por WxPilot 24.02.2014 / 16:36

2 respostas

0

Eu faria isso:

add_84_hours() {
    local datestamp=
    local start_hour=
    local epoch=$(date -ud "$datestamp $start_hour:00" +%s)
    date -ud "@$(( epoch + 84*3600 ))" +"%Y %_m %e %k"
}

Vamos ver o que ele retorna:

$ 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

Para salvar esses valores em variáveis:

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
    
por glenn jackman 24.02.2014 / 18:34
2

Se o seu sistema tiver a função de data do GNU, deve ser possível fazer a aritmética nativamente, por exemplo,

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

date --utc --date="18:00 today + 84 hours"
    
por steeldriver 24.02.2014 / 16:49