Subtraindo datas em unix

Subtraindo datas em unix

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 -xpara 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 dateGNU 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 mawka original-awkfunção está strftimeembutida, 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.

informação relacionada