Como obter milissegundos desde a época do Unix?

25

Eu quero fazer um script bash que meça o tempo de inicialização de um navegador para que eu esteja usando um html que obtenha o carimbo de tempo em carga em milissegundos usando JavaScript.

No script de shell pouco antes de ligar para o navegador, recebo o carimbo de data / hora com:

date +%s

O problema é que ele recebe o carimbo de tempo em segundos, e eu preciso disso em milissegundos, já que às vezes quando é executado uma segunda vez o navegador inicia em menos de um segundo e eu preciso ser capaz de medir precisamente esse tempo usando milissegundos de segundos.

Como posso obter o carimbo de data e hora em milissegundos a partir de um script bash?

    
por Eduard Florinescu 27.03.2013 / 14:18

4 respostas

27

date +%s.%N fornecerá, por exemplo, 1364391019.877418748 . O% N é o número de nanossegundos decorridos no segundo atual. Observe que são 9 dígitos e por padrão a data irá preencher isto com zeros se for menor que 100000000. Isto é realmente um problema se nós queremos fazer matemática com o número, porque bash trata os números com um zero inicial como octal . Esse preenchimento pode ser desativado usando um hífen na especificação de campo, portanto:

echo $(('date +%s'*1000+'date +%-N'/1000000))

ingenuamente lhe daria milissegundos desde a época.

No entanto , como Stephane Chazelas aponta no comentário abaixo, são duas chamadas date diferentes que renderão dois momentos ligeiramente diferentes. E se o segundo rolou entre eles, o cálculo será um todo segundo fora. Então:

echo $(($(date +'%s * 1000 + %-N / 1000000')))
    
por 27.03.2013 / 14:35
39

Eu usaria:

$ date +%s%3N

que retorna milissegundos desde a época do Unix.

    
por 08.04.2014 / 18:34
8

Caso alguém esteja usando outros shells do que bash , ksh93 e zsh têm uma variável $SECONDS de ponto flutuante se você fizer um typeset -F SECONDS , o que pode ser útil para medir o tempo com precisão:

$ typeset -F SECONDS=0
$ do-something
something done
$ echo "$SECONDS seconds have elapsed"
18.3994340000 seconds have elapsed

As versões recentes de zsh têm uma variável de ponto flutuante especial $EPOCHREALTIME no módulo zsh/datetime :

$ zmodload zsh/datetime
$ echo $EPOCHREALTIME
1364401642.2725396156
$ printf '%d\n' $((EPOCHREALTIME*1000))
1364401755993
    
por 27.03.2013 / 17:31
6

Para evitar cálculos para obter os milissegundos, os intérpretes JavaScript da linha de comando podem ajudar:

bash-4.2$ node -e 'console.log(new Date().getTime())' # node.js
1364391220596

bash-4.2$ js -e 'print(new Date().getTime())'         # SpiderMonkey
1364391220610

bash-4.2$ jsc-3 -e 'print(new Date().getTime())'      # WebKit
1364391220622

bash-4.2$ seed -e 'new Date().getTime()'              # GNOME object bridge
1364391220669
    
por 27.03.2013 / 14:30