Eu precisava resolver isso também, mas queria obter o mesmo valor para o dia #, independentemente da hora do dia. Com abordagens como as mostradas aqui, o valor será alterado à meia-noite no UTC em vez da meia-noite no horário local. Isso provavelmente parece ser um problema menor na UE ou na Costa Leste dos EUA, que estão próximos o suficiente do UTC de que o valor do dia não mudará no meio do dia normal de trabalho, mas, por exemplo, na Califórnia, a mudança do dia ocorreria às 16:00 PST, o que pode ser inconveniente. Eu imagino que os australianos ficariam especialmente irritados por ter a mudança no valor do dia no final da manhã.
Se quisermos corrigir isso, precisamos adicionar o deslocamento de UTC antes de dividir por segundos / dia. Felizmente, o comando data do Linux inclui uma sequência de formato % z que relata o deslocamento de UTC. Enquanto o formato padrão (este resultado é para o horário de Denver, MDT):
$ date +%z
-0600
. . não é diretamente utilizável em um cálculo, os modificadores certos produzirão o que queremos:
$ date +%-:::z
-6
Coloque junto com as conversões usuais de segundos / dias / dias, e acredito que o seguinte deve exibir os dias desde 1/1/1970, com 1/1/1970 sendo o dia zero, e o valor incrementando à meia-noite local tempo:
echo $(( ( $(date +"%s + ( %-:::z * 3600)") ) / 86400 ))
Esse cálculo simples não funcionará para fusos horários que não sejam deslocados do UTC por horas inteiras (por exemplo, Índia, TZ = Ásia / Kolkata), pois o "+5: 30" produzido por date +%-:::z
produzirá um " caractere inválido na expressão "erro quando usado na declaração acima.