Jak zdobyć TimeZone z telefonu komórkowego z systemem Android?

139

Po kliknięciu przycisku chcę pobrać strefę czasową z telefonu komórkowego z systemem Android.

asha przeciwko
źródło
11
TimeZone tz = TimeZone.getDefault (); String gmt1 = TimeZone.getTimeZone (tz.getID ()). GetDisplayName (false, TimeZone.SHORT); String gmt2 = TimeZone.getTimeZone (tz.getID ()). GetDisplayName (false, TimeZone.LONG); Log.d ("Tag", "TimeZone:" + gmt1 + "\ t" + gmt2); A to jest kod
asha v
10
Nie byłbym taki szorstki w stosunku do asha v. Szukałem tylko tego samego, a odpowiedzi, które znalazłem, były inne niż te. Właściwie wyszukiwanie według dokładnego „TimeZone.getDefault” doprowadziło mnie tutaj.
Yar

Odpowiedzi:

189

Czy próbowałeś użyć TimeZone.getDefault():

Większość aplikacji będzie używać TimeZone.getDefault (), która zwraca TimeZone na podstawie strefy czasowej, w której program jest uruchomiony.

Ref: http://developer.android.com/reference/java/util/TimeZone.html

MasterCassim
źródło
22
Jeśli korzystasz z JodaTime , możesz uzyskać DateTimeZone z następującymi elementami :DateTimeZone.forTimeZone(TimeZone.getDefault());
Joshua Pinter
@JoshPinter, którego pakietu używam, tego na android.icu.utils czy java.util?
Neon Warge
1
Zmieniłem strefę czasową z urządzenia na CST, nie zwraca mi CST. Czy jest sposób, aby uzyskać strefę czasową urządzenia?
Abhinav Saxena
Zastanawiam się, czy TimeZone.getDefault działa, jeśli w jakiś sposób sfałszujemy strefę czasową urządzenia. Wygląda na to, że nie ma go w symulatorze Androida.
Hau Luu
@NeonWarge Oba będą działać, chociaż android.icu działa tylko dla API 24 i nowszych.
Nicolas
136
TimeZone tz = TimeZone.getDefault();
System.out.println("TimeZone   "+tz.getDisplayName(false, TimeZone.SHORT)+" Timezon id :: " +tz.getID());

Wynik:

TimeZone GMT + 09: 30 Timezon id :: Australia / Darwin

Zulfiqar
źródło
@Flexo, jak uzyskać znacznik czasu z urządzenia z
Androidem
4
świetne wyjaśnienie z wynikami
Anand Savjani,
14

Potrzebowałem offsetu, który obejmowałby nie tylko czas oszczędzania światła dziennego, ale także liczbę . Oto kod, którego użyłem na wypadek, gdyby ktoś szukał przykładu.

Otrzymuję odpowiedź „3,5” (3:30 '), czyli tego, czego oczekiwałbym w Teheranie, Iranie zimą i „4,5” (4:30') latem.

Potrzebowałem go również jako ciągu znaków, aby móc wysłać go na serwer, więc możesz nie potrzebować ostatniej linii.

aby uzyskać aktualną strefę czasową:

TimeZone tz = TimeZone.getDefault();
Date now = new Date();
//Import part : x.0 for double number
double offsetFromUtc = tz.getOffset(now.getTime()) / 3600000.0;
String m2tTimeZoneIs = Double.parseDouble(offsetFromUtc);
Adnan Abdollah Zaki
źródło
1
To zadziałało dla mnie, ponieważ miałem do czynienia tylko z czasami trwania (jako stoper).
Ahsan
13

Wypróbuj ten kod-

Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();

Zwróci strefę czasową wybraną przez użytkownika.

anujprashar
źródło
4
Tworzenie w Calendartym celu obiektu to nonsens. Stworzenie tego typu obiektów jest kosztowne. TimeZone.getDefault()jest właściwym sposobem, aby to osiągnąć.
anonimowy
3
@KrLx_roller Sprawdź dokładnie, zanim zgodzisz głosowanie. Napisałem, że moja odpowiedź zwraca strefę czasową wybraną przez użytkownika, podczas gdy TimeZone.getDefault () zwróci domyślną strefę czasową instalacji. Aby uzyskać więcej informacji, prosimy o code.google.com/p/android/issues/detail?id=2037 .
anujprashar
Twój kod zwraca tę samą strefę czasową co TimeZone.getDefault () na Androidzie 4.2. TimeZone.getDefault () zwróci strefę czasową wybraną w ustawieniach -> data i czas.
user1088166
5
TimeZone timeZone = TimeZone.getDefault(); 
timeZone.getID();

Będzie drukować jak

Asia/Kolkata
Raja Jawahar
źródło
3

Najprostsze rozwiązanie z prostym formatem daty: SimpleDateFormat („ZZZZZ”):

 Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"),
                Locale.getDefault());
        Date currentLocalTime = calendar.getTime();

        DateFormat date = new SimpleDateFormat("ZZZZZ",Locale.getDefault());
        String localTime = date.format(currentLocalTime);
        System.out.println(localTime+ "  TimeZone   " );

==> Wynik to: +05: 30

Jaydeep purohit
źródło
2

ZoneId z java.time i ThreeTenABP

Nowoczesna odpowiedź:

    ZoneId zone = ZoneId.systemDefault();
    System.out.println(zone);

Kiedy uruchomiłem ten fragment w strefie czasowej Australii / Sydney, wynik był dokładnie taki:

Australia/Sydney

Jeśli chcesz mieć nazwę strefy czasowej lub jej skrót uwzględniający czas letni (DST):

    DateTimeFormatter longTimeZoneFormatter = DateTimeFormatter.ofPattern("zzzz", Locale.getDefault());
    String longTz = ZonedDateTime.now(zone).format(longTimeZoneFormatter);
    System.out.println(longTz);

    DateTimeFormatter shortTimeZoneFormatter = DateTimeFormatter.ofPattern("zzz", Locale.getDefault());
    String shortTz = ZonedDateTime.now(zone).format(shortTimeZoneFormatter);
    System.out.println(shortTz);
Eastern Summer Time (New South Wales)
EST

TimeZoneKlasa stosowany w większości innych odpowiedzi było to, co mieliśmy, gdy pytano w 2011 roku, mimo że został źle zaprojektowany. Dziś jest od dawna przestarzały i polecam zamiast tego używać java.time, nowoczesnego API daty i czasu Java, które pojawiło się w 2014 roku.

Pytanie: Czy java.time nie wymaga interfejsu API systemu Android na poziomie 26?

java.time działa dobrze zarówno na starszych, jak i nowszych urządzeniach z Androidem. Wymaga tylko co najmniej Javy 6 .

  • W Javie 8 i nowszych oraz na nowszych urządzeniach z Androidem (od poziomu API 26) wbudowane jest nowoczesne API.
  • W wersjach Java 6 i 7 innych niż Android pobierz ThreeTen Backport, zaplecze nowoczesnych klas (ThreeTen dla JSR 310; patrz linki na dole).
  • Na (starszym) systemie Android użyj wersji ThreeTen Backport na Androida. Nazywa się ThreeTenABP. I upewnij się, że importujesz klasy daty i czasu org.threeten.bpz podpakietami.

Spinki do mankietów

Ole VV
źródło
1

W przypadku urządzeń z API 26 i nowszym możesz to uzyskać w ten sposób:

ZonedDateTime.now().getZone().toString();
Maciej Beimcik
źródło
1

Na moim urządzeniu TimeZone.getDefault()zawsze wraca strefa czasowa UTC.

Muszę to zrobić, aby uzyskać strefę czasową skonfigurowaną przez użytkownika:

TimeZone.setDefault(null)
val tz = TimeZone.getDefault()

Zwróci strefę czasową wybraną przez użytkownika.

Bipi
źródło
0

Wszystkie odpowiedzi tutaj wydają się sugerować ustawienie parametru daylite na false . Jest to niepoprawne w przypadku wielu stref czasowych, które zmieniają skrócone nazwy w zależności od pory roku (np. EST vs EDT).

Poniższe rozwiązanie poda prawidłowy skrót zgodnie z aktualną datą strefy czasowej.

val tz = TimeZone.getDefault()
val isDaylite = tz.inDaylightTime(Date())
val timezone = tz.getDisplayName(isDaylite, TimeZone.SHORT)
DummyData
źródło
TimeZoneKlasa jest źle zaprojektowana i długo nieaktualne.
Ole VV