Tempo em milissegundos desde a época no terminal

42

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
Adam Matan
fonte

Respostas:

48

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.

PrimoCocaína
fonte
3
Agradável. Eu nem precisei adicionar o caminho, gdatefui instalado no /usr/local/bin/gdate.
Adam Matan
Isso é o que você esperaria. Todos os binários são instalados com o prefixo g. No caminho, forneci todos os mesmos gnu-coreutils sem o prefixo g. Portanto, se você adicioná-lo ao seu caminho como PATH = "/ usr / local / opt / coreutils / libexec / gnubin: $ PATH", ele substituirá os originais. Então OS X datetorna-se GNU date(em vez de gdate)
CousinCocaine
Tudo bem que deu certo.
CousinCocaine
3
Tecnicamente, o +%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.
LS
10

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
grg
fonte
O OS X não suporta %-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).
Gordon Davisson
@Gordon Sim, eu mencionei isso, mas se o OP estiver procurando por uma solução portátil que funcione com sucesso em sistemas capazes dessa precisão, o comando acima funcionará. Obviamente, você pode simplesmente acrescentar zeros à saída, mas copiar isso para outros sistemas que suportam precisão extra não seria o ideal.
grg
Ah entendo. Mas como o 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.
Gordon Davisson
@Gordon De fato, definir a variável a interromperia - suponho que a variável específica possa ser redefinida imediatamente antes da execução do comando, mas redefinir variáveis ​​como essa é algo que todo bom script deve fazer antes de executar comandos de qualquer maneira, por exemplo. Obviamente, tudo isso se baseia na minha suposição de que o OP deseja um script - resposta editada para incluir o acréscimo literal de zeros.
grg
2
O OP pediu "tempo desde a época, em milissegundos", esta é uma resposta sobre como adicionar zero a uma string. Não é o mesmo. Embora explicado no post, não é uma resposta para a pergunta.
CousinCocaine
6

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)) 
Frank Thonig
fonte
4

Perl é onipresente.

$ perl -MTime::HiRes=time -e 'printf "%.9f\n", time'
1557390839.244920969
ernix
fonte