Posso fazer alguma aritmética de data com date
comando como
$ date -u -d '3 days 2024-12-01T00:00:00Z' +%FT%H:%M:%SZ
2024-12-04T00:00:00Z
$
O date
comando pode analisar vários formatos de data, incluindo formatos ISO-8601. Existe uma maneira fácil de fazê-lo interpretar também intervalos ISO-8601? Abordagem ingênua falha...
$ date -u -d 'PT3D 2024-12-01T00:00:00Z' +%FT%H:%M:%SZ
date: invalid date ‘PT3D 2024-12-01T00:00:00Z’
$
O utilitário padrão
date
não suporta uma-d
opção. Há algumas implementações que suportam, mas às vezes para coisas completamente diferentes.Vários deles (incluindo alguns BSDs agora, embora tenham sua própria sintaxe diferente para isso) têm um
-d
para especificar uma data de entrada em vez de pegar o relógio do sistema, seguindodate
o exemplo do GNU, mas o(s) formato(s) de entrada que eles reconhecem é(são) diferente(s) entre eles. Alguns deles permitem especificar o formato de entrada destrptime()
forma (ast-open, busybox, toybox), outros não (GNU, NetBSD¹).Entre as
date
implementações que suportam-d
especificar uma data de entrada, eu conheço apenasast-open
's (AT&T Software Technology da AT&T Research, anteriormente conhecida como Bell Labs, onde o Unix nasceu) que suporta durações ISO8601. Mas ast-open não é mais mantido AFAIK.Entretanto
ksh93
, a biblioteca que usa a mesma manipulação de data ainda é mantida , e você pode usar suaprintf
biblioteca interna para fazer o equivalente ao GNUdate -d
:Esteja ciente de que o tratamento do horário de verão quando se trata de cálculo de data ainda apresenta muitos bugs, embora isso não se aplique a datas UTC.
Para torná-lo uma função a ser usada em outro shell do tipo Bourne:
¹ Embora o NetBSD, assim como outros BSDs, permita especificar o formato de entrada se for usado o estilo BSD para especificar a data de entrada.