Existe uma maneira no Unix de subtrair um mês ou pelo menos 30 dias de uma data específica? A data deve ser inserida pelo usuário.
Exemplo:
19/11/2012 - 1 mês = 19/10/2013
Este não funciona:
date -d '2013-10-13 - 1 month' '+%F'
Responder1
A maneira mais fácil é converter a data em um valor unix time_t (ou seja, segundos desde o início da época, ou '1-1-1970 00:00:00') e, em seguida, subtrair 30 dias * 86.400 segundos por dia desse número.
por exemplo, o exemplo a seguir usa set -x
para que você possa ver o valor da variável D conforme ela muda.
#! /bin/ksh
set -x
D=$(date -d '2013-10-13' '+%s')
D=$((D - 30 * 86400))
date -d "@$D"
Observe que isso depende da versão GNU do date
GNU Coreutils. Outras versões de date podem não suportar a conversão de um valor time_t de volta para uma data formatada com @
. A menos que você tenha instalado o GNU coreutils, isso provavelmente não estará disponível em seu sistema AIX, portanto gawk
é provavelmente sua melhor opção para converter de volta para uma data formatada:
echo "$D" | gawk '{print strftime("%c", $0)}'
minha resposta original aqui sugeriu o awk simples, mas testes adicionais em meu sistema debian revelaram que nem mawk
a original-awk
função está strftime
embutida, então você terá que instalar o GNU Coreutils ou o GNU Awk.
Se o perl estiver instalado no sistema, o perl poderá ser usado em vez do awk:
echo $D | perl -nE 'say scalar gmtime $_'
Existem vários métodos alternativos e exemplos de como fazer isso em:
https://stackoverflow.com/questions/3249827/convert-from-unixtime-at-command-line
Responder2
Experimente isto:
date --date="$(date -d "Nov 1 2012")-1 month" +'%Y:%m:%d'
2012:10:01
1º de novembro de 2012 é usado para ilustração. Isso pode ser qualquer data de entrada do usuário.
Responder3
Seu exemplo usa itens relativos em strings de data que são uma extensão de data GNU.
Por exemplo, no Fedora 19, seu exemplo funciona conforme o esperado:
$ date -d '2013-10-13 - 1 month' '+%F'
2013-09-13
Assim, você pode ter certeza de que seu script usa data GNU.
Responder4
Experimente isso.
DAY30=`TZ=EST+720 date "+%Y-%m-%d"`
print $DAY30
720 é o deslocamento em horas. Então, 30 dias são 720 horas.
EST é meu fuso horário. Presumo que você possa usar qualquer fuso horário apropriado.