Todas as outras perguntas na rede SE lidam com cenários em que a data é assumida como sendo now
( Q ) ou onde apenas uma data é especificada ( Q ).
O que eu quero fazer é fornecer uma data e hora e depois subtrair uma hora.
Aqui está o que eu tentei primeiro:
date -d "2018-12-10 00:00:00 - 5 hours - 20 minutes - 5 seconds"
Isso resulta em 2018-12-10 06:39:55
- Adicionou 7 horas. Subtraído em 20:05 minutos.
Depois de ler a página man
e , pensei em corrigi-lo com isso:info
date
date -d "2018-12-10T00:00:00 - 5 hours - 20 minutes - 5 seconds"
Mas, mesmo resultado. De onde ele tira as 7 horas?
Eu tentei outras datas também porque pensei que talvez tivéssemos 7200 segundos bissextos naquele dia, quem sabe lol. Mas mesmos resultados.
Mais alguns exemplos:
$ date -d "2018-12-16T00:00:00 - 24 hours" +%Y-%m-%d_%H:%M:%S
2018-12-17_02:00:00
$ date -d "2019-01-19T05:00:00 - 2 hours - 5 minutes" +%Y-%m-%d_%H:%M:%S
2019-01-19_08:55:00
Mas aqui isso se torna interessante. Se eu omitir o tempo de entrada, ele funciona bem:
$ date -d "2018-12-16 - 24 hours" +%Y-%m-%d_%H:%M:%S
2018-12-15_00:00:00
$ date -d "2019-01-19 - 2 hours - 5 minutes" +%Y-%m-%d_%H:%M:%S
2019-01-18_21:55:00
$ date --version
date (GNU coreutils) 8.30
o que estou perdendo?
Atualização: adicionei um Z
no final e isso mudou o comportamento:
$ date -d "2019-01-19T05:00:00Z - 2 hours" +%Y-%m-%d_%H:%M:%S
2019-01-19_04:00:00
Ainda estou confuso. Não há muito sobre isso na página de informações do GNU sobre a data.
Suponho que esse é um problema de fuso horário, mas citando o Wiki do calendário na ISO 8601 :
Se nenhuma informação de relação UTC for fornecida com uma representação de hora, presume-se que a hora esteja na hora local.
Qual é o que eu quero. Minha hora local também está definida corretamente. Não sei ao certo por que o date iria mexer com o fuso horário, neste simples caso de eu fornecer um datetime e querer subtrair algo dele. Não deve subtrair as horas da cadeia de datas primeiro? Mesmo que ele a converta primeiro em uma data e depois faça a subtração, se eu deixar de fora quaisquer subtrações, obtenho exatamente o que quero:
$ date -d "2019-01-19T05:00:00" +%Y-%m-%d_%H:%M:%S
2019-01-19_05:00:00
Então, se esse é realmente um problema de fuso horário, de onde vem essa loucura?