Subtraindo datas no unix

5

Existe uma maneira no unix de subtrair um mês ou pelo menos 30 dias a partir de uma data específica? A data deve ser inserida pelo usuário.

Exemplo:

2012-11-19 - 1 month = 2013-10-19

Este não funciona:

date -d '2013-10-13 - 1 month' '+%F'
    
por kickass13 05.10.2013 / 07:42

4 respostas

3

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 * 86400 segundos por dia a partir 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 é alterada.

#! /bin/ksh

set -x

D=$(date -d '2013-10-13' '+%s')
D=$((D - 30 * 86400))

date -d "@$D"

Note que isto depende da versão GNU de date , do GNU Coreutils. Outras versões da data 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 está disponível em seu sistema AIX, então 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 plain awk, mas testes adicionais no meu sistema debian revelaram que nem mawk nem original-awk tem a função strftime embutida, então você terá que instalar o GNU Coreutils ou GNU Awk.

Se o perl estiver instalado no sistema, o perl pode 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:

link

    
por 05.10.2013 / 08:19
2

Tente 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 de qualquer data de entrada do usuário.

    
por 05.10.2013 / 20:06
0

Seu exemplo usa itens relativos em strings de data que são uma extensão de data GNU.

Por exemplo, no Fedora 19, o seu exemplo funciona como esperado:

$ date -d '2013-10-13 - 1 month' '+%F'
2013-09-13

Assim, você pode ter certeza de que seu script usa a data do GNU.

    
por 05.10.2013 / 09:13
0

Tente 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 é o meu fuso horário. Eu suponho que você pode usar qualquer fuso horário apropriado.

    
por 27.11.2015 / 17:55

Tags