Como obtenho tempo desde a época, em milissegundos, no terminal OSX?
O equivalente Linux / Ubuntu é date +%s.%N
:
Linux $ date +%s.%N
1403377762.035521859
O que não funciona no meu terminal OSX:
OSX $ date +%s.%N
1403377800.N
Como obtenho tempo desde a época, em milissegundos, no terminal OSX?
O equivalente Linux / Ubuntu é date +%s.%N
:
Linux $ date +%s.%N
1403377762.035521859
O que não funciona no meu terminal OSX:
OSX $ date +%s.%N
1403377800.N
Respostas:
O date
programa no OS X é diferente do date
programa coreutils do GNU . Você pode instalar o coreutils (incluindo o gnu-date) e, em seguida, terá uma versão date
que suporta milissegundos.
Como a instalação da fonte pode ser um aborrecimento para usuários nativos do OS X, aconselho que você use o Homebrew .
Para instalar essas ferramentas usando o Homebrew, execute este oneliner no seu terminal:
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
O Homebrew está agora instalado (é aconselhável seguir as sugestões do instalador após a instalação). Agora vamos instalar o coreutils usando brew
.
brew install coreutils
Como a instalação diz, todos os comandos foram instalados com o prefixo 'g' (por exemplo, gdate, gcat, gln, etc etc). Se você realmente precisar usar esses comandos com seus nomes normais, poderá adicionar um diretório "gnubin" ao seu PATH ( ~/.bash_profile
) como:
PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
Agora você pode executar
gdate +%s.%N
e isso produzirá seu tempo desde a época em milissegundos.
date
torna-se GNU date
(em vez de gdate)
+%s.%N
formato reduz os segundos à precisão de nanossegundos, não a milissegundos. Depois que usei o brew para instalar gdate
, verifiquei a página de manual para ver se havia milissegundos disponíveis. Não é. Também não disse que uma precisão para %N
pudesse ser especificada, mas tentei mesmo assim. Descobri que o comando para reduzir os segundos à precisão de milissegundos (ou seja, três casas decimais) é gdate +%s.%3N
.
No OS X, basta executar, date +%s
pois o OS X não suporta mais precisão do que isso na date
saída e qualquer excesso de precisão não suportado pela representação interna é truncado para menos infinito.
Se você deseja uma saída em milissegundos, pode usar o comando a seguir, embora a saída seja apenas corrigida acrescentando zeros em vez de adicionar precisão devido ao motivo mencionado acima. A seguir, a saída corrige milissegundos em sistemas que suportam a precisão necessária.
echo $(($(date +'%s * 1000 + %-N / 1000000')))
Fonte para o comando acima: Unix.SE - Como obter milissegundos desde a época do Unix
Se você deseja apenas um comando que acrescente o número certo de zeros no OS X, você pode usar:
date +%s000
%-N
, portanto, isso não faz nada (e pode causar problemas se a variável shell $N
estiver definida). Basta usar date +%s000
(ou date +%s.000
se você quiser o ponto decimal).
date
comando do OS X passa apenas %-N
como N
, ele pode interferir no cálculo. Tente definir N=7000000000000000000
, depois tente o comando ... Este é um caso improvável na prática, mas me sentiria mais seguro com algo que não dependesse do ambiente.
Esta solução funciona no macOS.
se você considerar usar um script bash e tiver python disponível, poderá usar este código:
#!/bin/bash
python -c 'from time import time; print int(round(time() * 1000))'
Ou escreva um python
script diretamente:
#!/usr/bin/python
from time import time
print int(round(time() * 1000))
gdate
fui instalado no/usr/local/bin/gdate
.