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

6

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

Em sistemas que executam Data do GNU , posso fazer algo como isso:

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

Os sistemas FreeBSD ou MacOSX não são fornecidos com o GNU Date e não suportam valores como "X days ago".

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

Eu posso 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?

    
por Stefan Lasiewski 07.12.2010 / 00:24

3 respostas

7

Bem, você pode fazer algo sorrateiramente como:

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

Testado no OpenBSD (definitivamente não baseado em gnu), e parece funcionar.

Quebrando as etapas:

  • obtenha o unixtime atual (segundos desde o início da época do 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

* referenciada no link

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

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

** referenciado no link

    
por 07.12.2010 / 00:46
2

A resposta anterior foi complicada demais. FreeBSD / macOS tem o sinal -v para date , da página MAN (descrição abreviada) :

Adjust (i.e., take the current date and display the result of the adjustment; not actually set the date) the second, minute, hour, month day, week day, month or year according to val. If val is preceded with a plus or minus sign, the date is adjusted forwards or backwards according to the remaining string, otherwise the relevant part of the date is set. The date can be adjusted as many times as required using these flags. Flags are processed in the order given.

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

$ date; date -v-1125d
Thu 19 Oct 2017 11:35:25 EDT
Sat 20 Sep 2014 11:35:25 EDT
    
por 19.10.2017 / 17:34
0

Eu estava tendo um problema parecido, encontrei o pacote dateutils para o OpenBSD 6.4. Foi um simples pkg_add dateutils 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 é

#2018.11

UPDATE 1

Estou executando este comando em 2018.12.10

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

Resultado

 2015.11

Ele suporta a qualquer momento adições ou subtrações que eu possa dizer. Aqui estão os comandos que ajudam a imprimir. #dadd -h (essa não é a totalidade da impressão. Há mais informações sobre 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

DISCLAMER: Eu sou um novo usuário linux / unix. Eu não sou afiliado com o pacote de qualquer maneira.

Aqui são os comandos.

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

    
por 07.12.2018 / 21:16