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 dateprograma no OS X é diferente do dateprograma coreutils do GNU . Você pode instalar o coreutils (incluindo o gnu-date) e, em seguida, terá uma versão dateque 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.
datetorna-se GNU date(em vez de gdate)
+%s.%Nformato 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 %Npudesse 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 +%spois o OS X não suporta mais precisão do que isso na datesaí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 $Nestiver definida). Basta usar date +%s000(ou date +%s.000se você quiser o ponto decimal).
datecomando do OS X passa apenas %-Ncomo 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 pythonscript diretamente:
#!/usr/bin/python
from time import time
print int(round(time() * 1000))
gdatefui instalado no/usr/local/bin/gdate.