Calcular a data de 1125 dias atrás em sistemas não GNU?

Na linha de comando do Unix Bash, desejo calcular a data de 1125 dias atrás usando o sistema operacional de base (por exemplo, sem Perl ou Python).

Em sistemas que executam GNU Date , posso fazer algo assim:

ubuntu $ date --date="1125 days ago" Wed Nov 7 15:12:33 PST 2007 

Os sistemas FreeBSD ou MacOSX não são enviados com GNU Date e não suportam valores como “X dias atrás”.

freebsd81 $ date --date="+1125 days ago" date: illegal option -- - 

I pode calcular uma data de alguns dias atrás em um sistema Mac ou FreeBSD, mas isso é limitado a alguns dias:

# Today is really Dec 6, 2010. 4 days ago it was: macosx $ TZ=GMT+96 date +%Y%m%d 20101202 # But that doesn"t work if I want to see the date 8 days ago: macosx $ TZ=GMT+192 date +%Y%m%d 20101206 

Posso calcular datas antigas em sistemas não GNU sem se aprofundar em ferramentas como Perl ou Python? Ou devo usar uma linguagem de script mais poderosa?

Resposta

Bem, você pode fazer algo sorrateiro como:

 $ echo "`date +%s` - (1125 * 24 * 60 *60)" |bc 1194478815 $ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500 

Testado em OpenBSD (data definitivamente não baseada em GNU), e parece funcionar.

Dividindo em etapas:

  • obtenha o unixtime atual (segundos desde o início da época unix):
 $ date +%s 1291679934 
  • obtenha o número de segundos em 1125 dias
 $ echo "1125 * 24 * 60 *60" | bc 97200000 
  • subtraia um do outro (1291679934 – 97200000) = 1194478815

  • use o novo unixtime (1194478815) para imprimir uma data bonita

     $ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500 
  • Como alternativa, no solaris você pode fazer isso para imprimir a data *:

    /bin/echo "0t1194478815>Y\n<Y=Y" |adb

* referenciado em http://www.sun.com/bigadmin/shellme/

Além disso, uma alternativa no Solaris para obter o carimbo de data / hora atual do comando de data ** é:

/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= "/^time()/ {gsub(/ /,"",$2);print $2}"

** referenciado de http://www.commandlinefu.com/commands/view/7647/unix-timestamp-solaris

Comentários

  • Observe que %s e date -r são BSDismos (desde os primeiros dias, então eles ‘ re em todas as plataformas BSD). Não ‘ espere vê-los em plataformas System V (por exemplo, o Solaris não tem nenhum).
  • Ah, Solaris, como eu te amo … (;
  • @Gilles: Tem certeza? O Solaris tem vários diretórios bin, como / usr / ucb / bin, que contêm versões de outras variações do unix. O SunOS 4.X era baseado em BSD, afinal.
  • Isso falha quando qualquer um dos dias intermediários tem mais ou menos de 60 * 60 * 24 segundos, como segundos bissextos e mudanças de calendário.
  • @Sparr: Bom ponto. Um seguro abordagem é subtrair a hora do dia atual da data absoluta atual e adicionar 12 * 60 * 60. Isso retorna uma hora do dia entre 10:59 e 13:01. Adicionar períodos de 24 horas a isso e obter o a data correspondente é segura.

Resposta

A resposta anterior era muito complicada. FreeBSD / macOS tem a -v sinalizador para date, da página MAN (descrição abreviada):

Ajuste (ou seja, pegue a data atual e exiba o resultado do ajuste; não definir realmente a data) o segundo, minuto, hora, dia do mês, dia da semana, mês ou ano de acordo com val. Se val for precedido por um sinal de mais ou menos, a data é ajustada para frente ou para trás de acordo com a string restante, caso contrário, a parte relevante da data é definida. A data pode ser ajustada quantas vezes forem necessárias usando esses sinalizadores. Os sinalizadores são processados na ordem fornecida.

Portanto, para o seu propósito, date -v1125d fará simplesmente o que você precisa

$ date; date -v-1125d Thu 19 Oct 2017 11:35:25 EDT Sat 20 Sep 2014 11:35:25 EDT 

Resposta

Eu estava tendo um problema semelhante, encontrei o pacote dateutils para OpenBSD 6.4. Foi um pkg_add dateutils simples para mim.

#!/bin/ksh # Using dateutils dadd (get current date) -1month -f (format to strftime) # Set Year in YYYY formant y is YY format lastMonth=$(dadd date -1mo -f "%Y.%m") echo $lastMonth mkdir /home/$usr/History/$lastMonth 

Minha saída aqui é

#2018.11 

ATUALIZAÇÃO 1

Estou executando este comando em 10/12/2018

HostNameHere# dadd date -1125d -f "%Y.%m" 

Resultado

 2015.11 

Suporta qualquer adição ou subtração de tempo que eu possa dizer. Aqui estão os comandos que ajudam a imprimir. #dadd -h (esta não é a totalidade da impressão. Há mais informações sobre as opções.

 Usage: dadd [OPTION]... [DATE/TIME] [DURATION] Add DURATION to DATE/TIME and print the result. If DATE/TIME is omitted but DURATION is given, read a list of DATE/TIMEs from stdin. If DURATION is omitted but DATE/TIME is given, read a list of DURATIONs from stdin. Durations are specified as nY, nMO, nW, or nD for years, months, weeks, or days respectively, or nH, nM, nS for hours, minutes, and seconds, where N is a (possibly negative) number. The unit symbols can be written lower-case as well (y, mo, w, d, h, m, s) and the unit symbol `d" can be omitted. Note that duration addition is not commutative! 2000-03-30 +1mo +1d -> 2000-05-01 2000-03-30 +1d +1mo -> 2000-04-30 

Aqui estão os comandos.

Aqui estão as opções de formatação.

Comentários

  • (1) É ‘ bom que este programa suporte -1mo. Você pode demonstrar que permite ao usuário calcular a data de 1125 dias atrás, como a pergunta pergunta? (2) A pergunta diz ” usando a base sistema operacional (por exemplo, Sem Perl ou Python). ” Isso parece impedir a adição de um novo pacote.
  • @ G-Man Obrigado pelo comentário. Eu sou novo em contribuir no StackExchange. Obrigado pela ajuda. Veja ATUALIZAÇÃO 1

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *