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:
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.
datestaje się GNU date(zamiast gdate)
+%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.
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
%-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).
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.
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))
gdatezostał zainstalowany/usr/local/bin/gdate.