Você pode simplesmente usar %3Npara truncar os nanossegundos para os 3 dígitos mais significativos (que são milissegundos):
$ date +%s%3N
1397392146866
Isso funciona, por exemplo, no meu Kubuntu 12.04 (Precise Pangolin).
Mas esteja ciente de que %Npode não ser implementado dependendo do seu sistema de destino. Por exemplo, testado em um sistema incorporado (rootfs buildroot, compilado usando uma cadeia de ferramentas cruzada não HF ARM) não houve %N:
$ date +%s%3N
1397392146%3N
(E também meu tablet Android (sem root) não tem %N.)
Atualização: Outra alternativa no Bash puro que funciona apenas com o Bash 4.2+ é a mesma acima, mas use printfpara obter a data. Definitivamente será mais rápido, porque nenhum processo é bifurcado do principal.
printf -v test '%(%s%N)T' -1
testnum=${#test}
echo ${test:0:$testnum-6}
Outro problema aqui é que sua strftimeimplementação deve suportar %se %Nque não é o caso da minha máquina de teste. Consulte man strftimeas opções suportadas. Veja também man bashpara ver a printfsintaxe. -1e -2são valores especiais para o tempo.
Percebi que a versão do datecomando do MacOS não está interpretando a %Nsequência de formato como nanossegundos, mas simplesmente imprime Nna saída quando comecei a usar meu .bashrcscript do Linux, que o usa para medir por quanto tempo os comandos executados são executados em uma máquina MacOS.
Depois de um pouco de pesquisa, aprendi que apenas a data GNU do pacote GNU Coreutils suporta milissegundos . Felizmente, é muito fácil instalá-lo no MacOS usando o Homebrew:
brew install coreutils
Como esse pacote contém executáveis que já estão presentes no MacOS, os executáveis do Coreutils serão instalados com um gprefixo, portanto date, estarão disponíveis como gdate.
Este:
retornará o número de segundos desde a época.
Este:
retorna os segundos e os nanossegundos atuais.
Então:
fornecerá o número de milissegundos desde a época - segundos atuais mais os três nanossegundos à esquerda.
e de MikeyB -
echo $(($(date +%s%N)/1000000))
(dividir por 1000 só traz microssegundos)Você pode simplesmente usar
%3N
para truncar os nanossegundos para os 3 dígitos mais significativos (que são milissegundos):Isso funciona, por exemplo, no meu Kubuntu 12.04 (Precise Pangolin).
Mas esteja ciente de que
%N
pode não ser implementado dependendo do seu sistema de destino. Por exemplo, testado em um sistema incorporado (rootfs buildroot, compilado usando uma cadeia de ferramentas cruzada não HF ARM) não houve%N
:(E também meu tablet Android (sem root) não tem
%N
.)date +%N
não funciona no OS X, mas você pode usar um dosruby -e 'puts Time.now.to_f'
python -c 'import time; print(int(time.time() * 1000))'
node -e 'console.log(Date.now())'
php -r 'echo microtime(TRUE);'
DateTime.utc_now() |> DateTime.to_unix(:millisecond)
wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
date +%s000
Minha solução não é a melhor, mas funcionou para mim:
Eu só precisava converter uma data como 2012-05-05 para milissegundos.
Apenas jogando isso lá fora, mas acho que a fórmula correta com a divisão seria:
Esta solução funciona no macOS.
Se você considerar usar um script Bash e tiver o Python disponível, poderá usar este código:
Para as pessoas que sugerem a execução de programas externos para obter os milissegundos ... nessa taxa, você pode fazer isso:
O ponto é: antes de escolher qualquer resposta daqui, lembre-se de que nem todos os programas serão executados em um segundo inteiro. A medida!
Se você estiver procurando uma maneira de exibir o tempo de execução do seu script, o seguinte fornecerá um resultado (não totalmente preciso):
Tão perto do início do seu script quanto possível, digite o seguinte
basetime=$(date +%s%N)
Isso lhe dará um valor inicial de algo como 1361802943996000000.
No final do seu script, use o seguinte
echo "runtime: $(echo "scale=3;($(date +%s%N) - ${basetime})/(1*10^09)" | bc) seconds"
que exibirá algo como
runtime: 12.383 seconds
Notas:
(1*10^09) pode ser substituído por 1000000000 se desejar
"scale=3"
é uma configuração bastante rara que coagebc
a fazer o que você quer. Há muito mais!Eu só testei isso no Windows 7/MinGW... Eu não tenho uma caixa *nix adequada em mãos.
Aqui está como obter o tempo em milissegundos sem realizar a divisão. Talvez seja mais rápido...
Atualização: Outra alternativa no Bash puro que funciona apenas com o Bash 4.2+ é a mesma acima, mas use
printf
para obter a data. Definitivamente será mais rápido, porque nenhum processo é bifurcado do principal.Outro problema aqui é que sua
strftime
implementação deve suportar%s
e%N
que não é o caso da minha máquina de teste. Consulteman strftime
as opções suportadas. Veja tambémman bash
para ver aprintf
sintaxe.-1
e-2
são valores especiais para o tempo.Outra solução para MacOS: GNU Coreutils
Percebi que a versão do
date
comando do MacOS não está interpretando a%N
sequência de formato como nanossegundos, mas simplesmente imprimeN
na saída quando comecei a usar meu.bashrc
script do Linux, que o usa para medir por quanto tempo os comandos executados são executados em uma máquina MacOS.Depois de um pouco de pesquisa, aprendi que apenas a data GNU do pacote GNU Coreutils suporta milissegundos . Felizmente, é muito fácil instalá-lo no MacOS usando o Homebrew:
Como esse pacote contém executáveis que já estão presentes no MacOS, os executáveis do Coreutils serão instalados com um
g
prefixo, portantodate
, estarão disponíveis comogdate
.Veja, por exemplo , esta página para mais detalhes.