Tempo in millisecondi dall'epoca nel terminale


42

Come ottengo il tempo dall'epoca, in millisecondi, nel terminale OSX?

L'equivalente Linux / Ubuntu è date +%s.%N:

Linux $ date +%s.%N
1403377762.035521859

Che non funziona nel mio terminale OSX:

OSX $ date +%s.%N
1403377800.N

Risposte:


48

Il dateprogramma in OS X è diverso dal dateprogramma coreutils di GNU . Puoi installare coreutils (incluso gnu-date), quindi avrai una versione dateche supporta millisecondi.

Poiché l'installazione da sorgenti può essere una seccatura per gli utenti nativi di OS X, ti consiglio di usare Homebrew .

Per installare questi strumenti usando Homebrew esegui questo oneliner nel tuo terminale:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Homebrew è ora installato (è consigliabile seguire i suggerimenti dell'installatore dopo l'installazione). Ora installeremo coreutils usando brew.

brew install coreutils

Come dice l'installazione, tutti i comandi sono stati installati con il prefisso 'g' (ad es. Gdate, gcat, gln, ecc ecc). Se hai davvero bisogno di usare questi comandi con i loro nomi normali, puoi aggiungere una directory "gnubin" al tuo PATH ( ~/.bash_profile) come:

PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"

Ora puoi correre

gdate +%s.%N

e questo produrrà il tuo tempo dall'epoca in millisecondi.


3
Bello. Non ho nemmeno dovuto aggiungere il percorso, è gdatestato installato /usr/local/bin/gdate.
Adam Matan,

Questo è quello che ti aspetteresti. Tutti i binari sono installati con il prefisso g. Nel percorso che ho fornito tutti gli stessi gnu-coreutils sono senza il prefisso g. Quindi se lo aggiungi nel tuo percorso come PATH = "/ usr / local / opt / coreutils / libexec / gnubin: $ PATH" sostituirà gli originali. Quindi OS X datediventa GNU date(invece di gdate)
CousinCocaine,

Bene che ha funzionato.
Cugina Cocaina,

3
Tecnicamente, il +%s.%Nformato dà i secondi alla precisione dei nanosecondi, non ai millisecondi. Dopo aver usato brew per l'installazione gdate, ho controllato la manpage per vedere se erano disponibili millisecondi. Non è. Inoltre non ha detto che si %Npotesse specificare una precisione per , ma l'ho provato comunque. Ho scoperto che il comando per ridurre i secondi alla precisione in millisecondi (ovvero tre posizioni decimali) è gdate +%s.%3N.
LS

10

In OS X, esegui semplicemente date +%scome OS X non supporta una precisione maggiore di questa datenell'output e qualsiasi precisione in eccesso non supportata dalla rappresentazione interna viene troncata verso meno infinito.

Se si desidera un output in millisecondi, è possibile utilizzare il comando seguente, anche se l'output viene corretto semplicemente aggiungendo zeri anziché aggiungendo precisione a causa del motivo di cui sopra. Di seguito vengono emessi millisecondi corretti su sistemi che supportano la precisione necessaria.

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

Fonte per il comando precedente: Unix.SE - Come ottenere millisecondi dall'epoca di Unix

Se vuoi solo un comando che accosti il ​​giusto numero di zeri in OS X, puoi usare:

date +%s000

OS X non supporta %-N, quindi non fa nulla (e potrebbe causare problemi se la variabile di shell $Nè impostata). Basta usare date +%s000(o date +%s.000se si desidera il punto decimale).
Gordon Davisson,

@Gordon Sì, ne ho parlato, ma se OP è alla ricerca di una soluzione portatile che funzioni con successo su sistemi in grado di tale precisione, il comando sopra funziona. Ovviamente potresti semplicemente aggiungere zeri all'output ma copiarlo su altri sistemi che potrebbero supportare la precisione extra non sarebbe l'ideale.
grg

Ah, capisco. Ma dal momento che il datecomando di OS X passa %-Ncome N, può interferire con il calcolo. Prova a impostare N=7000000000000000000, quindi prova il comando ... In pratica questo è un caso improbabile, ma mi sentirei più sicuro con qualcosa che non dipende dall'ambiente.
Gordon Davisson,

@Gordon In effetti, l'impostazione della variabile la spezzerebbe: suppongo che la variabile specifica possa essere ripristinata poco prima dell'esecuzione del comando, ma il ripristino di variabili del genere è qualcosa che ogni buon script dovrebbe fare prima di eseguire comandi comunque, imo, per ogni evenienza. Ovviamente, tutto ciò si basa sul mio presupposto che l'OP voglia una risposta script-modificata per includere l'aggiunta letterale di zeri.
grg

2
L'OP ha chiesto "tempo dall'epoca, in millisecondi", questa è una risposta su come aggiungere zero a una stringa. Non lo stesso. Sebbene spiegato nel post, non una risposta alla domanda.
Cugina Cocaina,

6

questa soluzione funziona su macOS.

se consideri l'utilizzo di uno script bash e disponi di python disponibile, puoi usare questo codice:

#!/bin/bash

python -c 'from time import time; print int(round(time() * 1000))'

Oppure scrivi pythondirettamente uno script:

#!/usr/bin/python

from time import time
print int(round(time() * 1000)) 

4

Perl è onnipresente.

$ perl -MTime::HiRes=time -e 'printf "%.9f\n", time'
1557390839.244920969
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.