Fiz o seguinte ontem à noite (antes da meia-noite de domingo na Alemanha):
Data de hoje
$ LC_TIME="en.GB.UTF8" date --iso-8601
2025-01-12
- Data de hoje (dia da semana
$ LC_TIME="en.GB.UTF8" date +%u
7
$ LC_TIME="en.GB.UTF8" date +%a
Sun
Emitir
- Como a semana começa de segunda a domingo, a segunda-feira desta semana deve ser 2025-01-06
$ LC_TIME="en_GB.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
$ LC_TIME="en_IE.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
$ LC_TIME="en_IN.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
$ LC_TIME="en_US.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
$ LC_TIME="en_DE.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
$ LC_TIME="en_JP.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
$ LC_TIME="en_DK.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
$ LC_TIME="en_CA.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
$ LC_TIME="en_AU.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
Outra observação
Fiz isso hoje em 2025-01-13 (na Alemanha)
$ LC_TIME="en_AU.UTF-8" date -d "this-week-sunday" --iso-8601
2025-01-19
$ LC_TIME="en_AU.UTF-8" date -d "last-week-sunday" --iso-8601
2025-01-12
$ LC_TIME="en_AU.UTF-8" date -d "next-week-sunday" --iso-8601
2025-01-26
Emitir
Então, hoje parece estar dando resultados parcialmente corretos. O que está errado na saída de hoje: se da saída de ontem this-week-monday
estava 2025-01-13
assim, de alguma forma o computador estava contando domingo como o primeiro dia da semana em cada localidade (que mostrei acima). Então "this-week-sunday"
deveria ser ontem e não 2025-01-19 (como mostrado hoje).
Resumo
Ontem
$ LC_TIME="en_GB.UTF-8" date -d "this-week-monday" --iso-8601
2025-01-13
Hoje
env -i bash --norc --noprofile
bash-5.2$ LC_TIME="en_AU.UTF-8" date -d "this-week-sunday" --iso-8601
2025-01-19
Problema : Então, se ontem (2025-01-12, domingo) this-week-monday
foi dia 13, hoje this-week-sunday
deveria ser ontem e não . 2025-01-19
Por que estou recebendo a data errada?
Para a implementação GNU de
date
, vejainfo date 'date input'
a descrição do formato de entrada.Relevante:
Aqui você tem um formato de data relativa onde
this
é o número ordinal 0,week
um multiplicador. Entãodate -d 'this week monday'
é o mesmodate -d monday
que leva você para a próxima segunda-feira (ou hoje se hoje for uma segunda-feira) já quethis week
não tem efeito, pois desloca o tempo em 0.A propósito, é o mesmo com
date
o ¹ do ast-open (o mesmo que noprintf %T
) do ksh93.Aqui, em vez disso, você poderia fazer:
O que desloca a hora atual para trás em um número de dias, que é o número do dia da semana atual (1 para segunda-feira, 7 para domingo) menos 1.
Cuidado, isso não funcionará corretamente no meio da noite, perto das mudanças de horário de verão, pois um
day
na verdade significa 86400 segundos. Então, por exemplo, se executado2024-10-27T23:30:00
na Europa, isso lhe dará 2024-10-22, que é uma terça-feira, já que 2024-10-27 tinha na verdade 25 horas de duração por causa da mudança para o horário de inverno pela manhã.Para resolver isso, o melhor é fazer os cálculos ao meio-dia (e torcer para que você não esteja em um fuso horário em que o governo decidiu mudar de GMT+12 para GMT-12 naquela semana).
Ou mude para o zsh, que tem análise e formatação de data e hora integradas, o que evitaria os GNUismos.
¹ busybox
date
é outra implementação onde você pode inserir uma data específica, mas datas relativas não são suportadas lá (embora pelo menos suporte especificar o formato de entrada com-D
, como o ast-open's-p
). BSDs têm uma API diferente para especificar datas de entrada (e dependendo do BSD,-d
é para algo totalmente não relacionado, enquanto alguns outros adicionaram um-d
para compatibilidade com GNU's).