Existe alguma ferramenta no Solaris UNIX (portanto, nenhuma ferramenta GNU disponível) para subtrair datas? Eu sei que no Linux temos gawk
que podemos subtrair uma data de outra. Mas no Solaris o máximo que temos é nawk
(melhorado awk
) que não pode executar cálculos de data. Também não posso usar perl.
Existe alguma maneira de fazer cálculos de datas 20100909 - 20001010
?
ATUALIZAÇÃO: É bc
capaz de executar cálculos de datas?
Respostas:
Aqui está um script awk que acabei de escrever, deve funcionar com um awix POSIX. Você terá que experimentar a versão Solaris; lembre-se de que também existem duas versões do Awk no Solaris, uma em / bin e outra em / usr / xpg4 / bin / awk (que é nawk, acredito).
Passe uma sequência de datas AAAAMMdd e ela será convertida em número de segundos desde a época (com um pouco de atenção por estar nos limites do dia). Então você poderá subtrair os dois.
fonte
Infelizmente, nenhum dos utilitários de linha de comando POSIX fornece aritmética nas datas.
date -d
edate +%s
é o caminho a percorrer, se você os possuir, mas são extensões GNU.Há um truque desajeitado com
touch
esse tipo de trabalho para verificar se uma data é pelo menos n dias no passado:(Observe que esse código pode ser desativado em um se o horário de verão tiver sido iniciado ou interrompido no intervalo e o script for executado antes da 01:00.)
Várias pessoas acabaram implementando bibliotecas de manipulação de datas no Bourne ou no POSIX shell. Existem alguns exemplos e links na FAQ do comp.unix.shell .
A instalação de ferramentas GNU pode ser o caminho menos trabalhoso.
fonte
Eu tentaria usar o
date
comando que faz parte do POSIX, por isso está praticamente em todo lugar. ATUALIZAÇÃO: Infelizmente, parece que -d não faz parte da data POSIX e provavelmente não existe no Solaris. Portanto, isso provavelmente não responderá à pergunta dos OPs.Agora
d1
ed2
são números inteiros que correspondem a segundos desde a época do unix. Assim, para obter a diferença entre os dois, subtraímos ($((d1-d2))
no bash) e nos escondemos para as unidades que desejamos. Os dias são os mais fáceis:Como fazer a conversão provavelmente será diferente se você não tiver o bash. A maneira mais portátil pode ser usar
expr
( página de manual do expr posix ).fonte
Para constar, dateutils é minha tentativa de fornecer um conjunto de ferramentas portáteis que cobrem a aritmética de datas. Seu exemplo se resume a
O
-i
especifica o formato de entrada.fonte
É provável que o Perl esteja instalado, e é fácil o suficiente pegar módulos do CPAN , instalá-los no diretório inicial e consultá-los no seu programa. Nesse caso, o módulo Date :: Calc possui uma
Delta_Days
sub - rotina que ajudará.fonte
Data do GNU escrita no Solaris:
Eu digo isso de novo:
Muitos Solaris SysAdmins se orgulham de não instalar deliberadamente os pacotes oficiais da Sun (agora Oracle) que tornam um sistema Solaris "compatível com GNU" quando configuram um novo host. Me bate por que.
A Data GNU é excelente e deve estar disponível por padrão em qualquer host Solaris, IMHO.
No Solaris 10
Instale o pacote SFWcoreu a partir do CD do Solaris Companion. Após a instalação, você encontrará a data do GNU em
/opt/sfw/bin/date
No Solaris 11
Você já pode tê-lo, pois acredito que faz parte da instalação padrão. No entanto, é chamado
gdate
para distingui-lo da versão Sun da data.Faça isso se não estiver instalado:
fonte
/usr/bin/gdate
e,/usr/gnu/bin/date
portanto, você poderá optar por usá-lo pelo nome ou pela configuração $ PATH.Se você tem Python:
Você marcou sua pergunta como "gawk", mas diz "sem ferramentas GNU". Gawk tem data aritmética.
fonte
python:
fonte
1. Defina data1 e data2 no formato do
%j
dia do ano (001..366)2. Calcule a diferença com
expr
3. Então, a resposta é 32 dias
... ou solução de uma linha
ou
ou
fonte
Com a data BSD para macOS:
fonte
Você pode usar a biblioteca awk Velour para retornar a diferença em segundos:
Ou dias:
fonte