Chcę uzyskać aktualny czas UTC w milisach. Przeszukałem google i otrzymałem odpowiedzi, że System.currentTimeMillis () zwraca czas UTC. ale tak nie jest. Jeśli wykonam następujące czynności:
long t1 = System.currentTimeMillis();
long t2 = new Date().getTime();
long t3 = Calendar.getInstance().getTimeInMillis();
wszystkie trzy czasy są prawie takie same (różnica jest w milisekundach z powodu połączeń).
t1 = 1372060916
t2 = 1372060917
t3 = 1372060918
i tym razem nie jest czasem UTC, a jest to moja strefa czasowa. Jak mogę sprawdzić aktualny czas UTC w systemie Android?
Odpowiedzi:
Wszystkie trzy linie, które pokazałeś, podają liczbę milisekund od epoki unixowej, która jest stałym punktem w czasie, na który nie ma wpływu lokalna strefa czasowa.
Mówisz „ten czas nie jest czasem UTC” - podejrzewam, że faktycznie źle to zdiagnozowałeś. Sugerowałbym użycie do tego epochconverter.com . Na przykład w Twoim przykładzie:
1372060916 = Mon, 24 Jun 2013 08:01:56 GMT
Nie wiemy, kiedy generowany tę wartość, ale chyba to było w rzeczywistości o 8:01 czasu UTC, jest to problem z zegarem systemowym.
Ani
System.currentTimeMillis
ani wartość wDate
sobie wpływa strefy czasowej. Należy jednak mieć świadomość, żeDate.toString()
nie korzystać z lokalnej strefy czasowej, która wprowadza w błąd wielu twórców do myślenia, żeDate
jest nieodłącznie związane ze strefy czasowej - to nie jest, to tylko chwila w czasie, bez podania strefy czasowej, a nawet systemu kalendarzowego.źródło
Date.getTime()
aby znaleźć czas w milisekundach od epoki uniksowej, podziel przez 1000 (ponieważ nazwa pliku jest w sekundach od epoki systemu Unix) i sformatuj tę liczbę całkowitą jako ciąg.Mogę potwierdzić, że wszystkie trzy wezwania mogą zależeć od czasu lokalnego, biorąc pod uwagę epokę, a nie czas
Date.toString()
metody lub podobnej. Widziałem, że zależą one od czasu lokalnego na określonych urządzeniach z Androidem 2.3. Nie testowałem ich z innymi urządzeniami i wersjami Androida. W tym przypadku czas lokalny został ustawiony ręcznie.Jedynym niezawodnym sposobem uzyskania niezależnego czasu UTC jest żądanie aktualizacji lokalizacji przy użyciu
GPS_PROVIDER
.getTime()
Wartość pobierana z lokalizacjiNETWORK_PROVIDER
zależy również od czasu lokalnego. Inną opcją jest na przykład pingowanie serwera, który zwraca znacznik czasu UTC.Więc to, co robię, jest następujące:
public static String getUTCstring(Location location) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); sdf.setTimeZone(TimeZone.getTimeZone("UTC")); String date = sdf.format(new Date(location.getTime())); // Append the string "UTC" to the date if(!date.contains("UTC")) { date += " UTC"; } return date; }
źródło