2013-03-25 11 views
9

Jeśli użyję System.currentTimeMillis() o 00:00, otrzymam wartość X.System.currentTimeMillis(); Jeśli zmienię czas systemowy

Następnie ustawiam zegar z powrotem na godzinę, a po godzinie dzwonię pod numer System.currentTimeMillis().

powróci X ponownie, czy będzie to po prostu być X + 3600 * 1000

+0

Zgodnie z javadoc, zwraca * różnicę, mierzoną w milisekundach, między bieżącym czasem i północą, 1 stycznia 1970 UTC. * =>, Więc możesz oczekiwać, że zostanie on skorygowany, jeśli zmienisz zegar komputera . – assylias

+1

Brak gwarancji, wierzę. W różnych systemach JDK musi przeskakiwać przez różne obręcze, aby uzyskać czas systemowy, i nie zawsze może reagować natychmiast na zmiany zegara systemowego. –

Odpowiedz

10

W skrócie, po każdej zmianie czasu systemowego, wartość zwracana przez System.currentTimeMillis() będzie odpowiednio zmienić.

Jest to przeciwieństwo do System.nanoTime().

+0

Wiedziałem o nanoTime(), ale czytałem, że było 20 razy droższe niż currentTimeMillis, więc wolałbym tego uniknąć. Nie potrzebuję dużej precyzji (błąd pół sekundy może być doskonale dobry). Czy są jakieś alternatywy, czy powinienem po prostu użyć nanoTime? – Twinone

+0

@ TwinOneAndroid 20 razy kilka cykli procesora wciąż nie jest dużo, chyba że nazywasz to tysiące razy na sekundę ... Więcej o tym [tutaj] (https://blogs.oracle.com/dholmes/entry/inside_the_hotspot_vm_clocks). – assylias

+2

@TwinOneAndroid Aby zmierzyć * przedziały czasu *, uważam, że powinieneś ** zawsze ** używać 'nanoTime()'. (Nie pamiętam dokładnie, dlaczego, w pewnym sensie, coś związanego z czasem systemowym zachowuje się w sposób sprzeczny z intuicją.) Więc weź to z przymrużeniem oka.) – millimoose

0

Zwróci X, ponieważ System.currentTimeMillis() zwraca liczbę milisekund od epoki. Oznacza to, że będzie on zsynchronizowany z zegarem i policzyć liczbę sekund od 1 stycznia 1970 UTC

1

W systemie Android zawsze można użyć SystemClock.elapsedRealtime().

Powiązane problemy