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
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
Odpowiedzi:
date
Program w OS X jest inna niż Coreutils GNU date
programu. Możesz zainstalować coreutils (w tym gnu-date), wtedy będziesz mieć wersję date
obsł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.
date
staje się GNU date
(zamiast gdate)
+%s.%N
format podaje sekundy z dokładnością do nanosekund, a nie milisekund. Po zainstalowaniu naparu gdate
sprawdził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
.
W OS X wystarczy uruchomić, date +%s
ponieważ OS X nie obsługuje żadnej dokładności większej niż ta w date
danych 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
%-N
, więc nic nie robi (i może powodować problemy, jeśli $N
ustawiona jest zmienna powłoki ). Wystarczy użyć date +%s000
(lub date +%s.000
jeśli chcesz przecinek dziesiętny).
date
przechodzi właśnie %-N
przez 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.
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 python
skrypt bezpośrednio:
#!/usr/bin/python
from time import time
print int(round(time() * 1000))
gdate
został zainstalowany/usr/local/bin/gdate
.