Assumindo que o fuso horário está configurado corretamente e a data do GNU, você pode obter o carimbo de data / hora Unix, subtrair, adicionar 60 minutos e convertê-lo de volta ao formato necessário:
$ ts=$(date -d "2018-05-16 21:30:00" +%s) # For BSD date: date -jf "%F %T" "2018-05-16 21:30:00" +%s
$ echo "$(date -d@$((ts - 3600)) +"%F %T")"
2018-05-16 20:30:00
$ echo "$(date -d@$((ts + 3600)) +"%F %T")"
2018-05-16 22:30:00
... Eu acho que isso não conta corretamente para segundos bissextos e vários outros problemas que todo programador deve saber sobre o tempo .