Czas w milisekundach od epoki w terminalu

42

Jak uzyskać czas od epoki, w milisekundach, w terminalu OSX?

Odpowiednikiem Linux / Ubuntu jest date +%s.%N:

Linux $ date +%s.%N
1403377762.035521859

Który nie działa w moim terminalu OSX:

OSX $ date +%s.%N
1403377800.N
Adam Matan
źródło

Odpowiedzi:

48

dateProgram w OS X jest inna niż Coreutils GNU dateprogramu. Możesz zainstalować coreutils (w tym gnu-date), wtedy będziesz mieć wersję dateobsługującą milisekundy.

Ponieważ instalacja ze źródła może być kłopotliwa dla rodzimych użytkowników OS X, radzę używać Homebrew .

Aby zainstalować te narzędzia za pomocą Homebrew, uruchom ten oneliner w swoim terminalu:

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

Homebrew jest teraz zainstalowany (dobrze jest postępować zgodnie z sugestiami instalatora po instalacji). Teraz zainstalujemy coreutils za pomocą brew.

brew install coreutils

Jak mówi instalacja, wszystkie komendy zostały zainstalowane z prefiksem „g” (np. Gdate, gcat, gln itp.). Jeśli naprawdę potrzebujesz używać tych poleceń z ich normalnymi nazwami, możesz dodać katalog „gnubin” do PATH ( ~/.bash_profile), na przykład:

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

Możesz teraz biegać

gdate +%s.%N

a to wyda twój czas od epoki w milisekundach.

Kuzyn Kokaina
źródło
3
Miły. Nie musiałem nawet dodawać ścieżki, gdatezostał zainstalowany /usr/local/bin/gdate.
Adam Matan
Tego byś się spodziewał. Wszystkie pliki binarne są instalowane z prefiksem g. Na ścieżce podałem, że wszystkie te same gnu-coreutils są bez prefiksu g. Więc jeśli dodasz go do swojej ścieżki, jak PATH = "/ usr / local / opt / coreutils / libexec / gnubin: $ PATH", zastąpi oryginały. OS X datestaje się GNU date(zamiast gdate)
CousinCocaine
Dobrze, że się udało.
CousinCocaine
3
Technicznie +%s.%Nformat podaje sekundy z dokładnością do nanosekund, a nie milisekund. Po zainstalowaniu naparu gdatesprawdziłem stronę podręcznika, aby sprawdzić, czy milisekundy są dostępne. To nie jest. Nie powiedział też, że można określić dokładność dla %N, ale i tak spróbowałem. Odkryłem, że polecenie, aby sprowadzić sekundy do precyzji tylko w milisekundach (tj. Trzy miejsca po przecinku), to gdate +%s.%3N.
LS
10

W OS X wystarczy uruchomić, date +%sponieważ OS X nie obsługuje żadnej dokładności większej niż ta w datedanych wyjściowych, a wszelka nadmierna precyzja nie obsługiwana przez wewnętrzną reprezentację jest obcinana w kierunku minus nieskończoności.

Jeśli chcesz otrzymać wynik w milisekundach, możesz użyć następującego polecenia, chociaż wynik jest właśnie korygowany przez dodanie zer zamiast dodawania precyzji z wyżej wymienionego powodu. Poniżej podano prawidłowe milisekundy w systemach obsługujących wymaganą precyzję.

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

Źródło powyższego polecenia: Unix.SE - Jak uzyskać milisekundy od epoki Uniksa

Jeśli potrzebujesz tylko polecenia zawierającego odpowiednią liczbę zer w systemie OS X, możesz użyć:

date +%s000
grg
źródło
OS X nie obsługuje %-N, więc nic nie robi (i może powodować problemy, jeśli $Nustawiona jest zmienna powłoki ). Wystarczy użyć date +%s000(lub date +%s.000jeśli chcesz przecinek dziesiętny).
Gordon Davisson,
@Gordon Tak, wspomniałem o tym, ale jeśli OP szuka przenośnego rozwiązania, które z powodzeniem działa na systemach, które są w stanie z taką precyzją, powyższe polecenie działa. Oczywiście możesz po prostu dodać zera do wyjścia, ale skopiowanie go do innych systemów, które mogą obsługiwać dodatkową precyzję, nie byłoby idealne.
grg
O, rozumiem. Ale ponieważ polecenie OS X dateprzechodzi właśnie %-Nprzez N, może zakłócać obliczenia. Spróbuj ustawić N=7000000000000000000, a następnie wypróbuj polecenie ... Jest to mało prawdopodobny przypadek w praktyce, ale czułbym się bezpieczniejszy z czymś, co nie zależało od środowiska.
Gordon Davisson,
@ Gordon Rzeczywiście, ustawienie zmiennej mogłoby ją zepsuć - przypuszczam, że konkretna zmienna mogłaby zostać zresetowana tuż przed uruchomieniem polecenia, ale resetowanie takich zmiennych jest czymś, co powinien zrobić każdy dobry skrypt przed uruchomieniem poleceń, imo, na wszelki wypadek. Oczywiście wszystko to opiera się na moim założeniu, że OP chce odpowiedzi zredagowanej przez skrypt, aby zawierała dosłowne dopisywanie zer.
grg
2
OP poprosił o „czas od epoki, w milisekundach”, jest to odpowiedź na pytanie, jak dodać zero do ciągu. Nie ten sam. Chociaż wyjaśnione w poście, nie jest odpowiedzią na pytanie.
CousinCocaine
6

to rozwiązanie działa w systemie macOS.

jeśli rozważasz użycie skryptu bash i masz dostępny Python, możesz użyć tego kodu:

#!/bin/bash

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

Lub napisz pythonskrypt bezpośrednio:

#!/usr/bin/python

from time import time
print int(round(time() * 1000)) 
Frank Thonig
źródło
4

Perl jest wszechobecny.

$ perl -MTime::HiRes=time -e 'printf "%.9f\n", time'
1557390839.244920969
ernix
źródło