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
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
%s
edate -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).