Wie bekomme ich TimeZone von Android Mobile?

139

Ich möchte die Zeitzone vom Android-Handy abrufen, wenn ich auf eine Schaltfläche klicke.

asha v
quelle
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); Und das ist der Code
Asha v
10
Ich würde Asha v nicht so grob gegenüberstehen. Ich suchte nur das Gleiche und die Antworten, die ich fand, waren anders als diese. Die Suche nach der genauen "TimeZone.getDefault" führte mich hierher.
Yar

Antworten:

189

Haben Sie versucht zu verwenden TimeZone.getDefault():

Die meisten Anwendungen verwenden TimeZone.getDefault (), das eine Zeitzone basierend auf der Zeitzone zurückgibt, in der das Programm ausgeführt wird.

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

MasterCassim
quelle
22
Wenn Sie JodaTime verwenden , können Sie eine DateTimeZone mit den folgenden Eigenschaften erhalten:DateTimeZone.forTimeZone(TimeZone.getDefault());
Joshua Pinter
@JoshPinter Welches Paket verwende ich, das auf android.icu.utils oder das java.util?
Neon Warge
1
Ich habe die Zeitzone vom Gerät auf CST geändert. Es gibt mir kein CST zurück. Gibt es eine Möglichkeit, die Zeitzone des Geräts abzurufen?
Abhinav Saxena
Ich frage mich, ob TimeZone.getDefault betroffen ist, wenn wir die Zeitzone des Geräts irgendwie vortäuschen. Es scheint nicht auf dem Android-Simulator zu sein.
Hau Luu
136
TimeZone tz = TimeZone.getDefault();
System.out.println("TimeZone   "+tz.getDisplayName(false, TimeZone.SHORT)+" Timezon id :: " +tz.getID());

Ausgabe:

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

Zulfiqar
quelle
@ Flexo, wie man Zeitstempel von Android-Gerät
KOUSIK Daniel
4
tolle Erklärung mit Ausgabe
Anand Savjani
14

Ich brauchte den Offset , der nicht nur die Sommerzeit, sondern auch eine Ziffer enthielt . Hier ist der Code, den ich verwendet habe, falls jemand nach einem Beispiel sucht.

Ich bekomme eine Antwort von "3,5" (3:30 ') , was ich im Winter in Teheran, Iran, und "4,5" (4:30') für den Sommer erwarten würde .

Ich brauchte es auch als Zeichenfolge, damit ich es auf einem Server veröffentlichen konnte, sodass Sie möglicherweise nicht die letzte Zeile benötigen.

um die richtige Zeitzone zu erhalten:

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
quelle
1
Es hat bei mir funktioniert, da ich mich nur mit Dauern befasste (als Stoppuhr).
Ahsan
13

Versuchen Sie diesen Code-

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

Die vom Benutzer ausgewählte Zeitzone wird zurückgegeben.

anujprashar
quelle
4
Ein CalendarObjekt dafür zu erstellen ist ein Unsinn. Die Erstellung dieser Art von Objekt ist teuer. TimeZone.getDefault()ist der geeignete Weg, um dies zu bekommen.
anonym
3
@KrLx_roller Bitte überprüfen Sie dies sorgfältig, bevor Sie die Antwort ablehnen. Ich habe geschrieben, dass meine Antwort die vom Benutzer ausgewählte Zeitzone zurückgibt, während TimeZone.getDefault () die Standardzeitzone für die Installation zurückgibt. Für weitere Informationen wenden Sie sich bitte an code.google.com/p/android/issues/detail?id=2037 .
Anujprashar
Ihr Code gibt dieselbe Zeitzone zurück wie TimeZone.getDefault () unter Android 4.2. TimeZone.getDefault () gibt die in den Einstellungen -> Datum und Uhrzeit ausgewählte Zeitzone zurück.
user1088166
5
TimeZone timeZone = TimeZone.getDefault(); 
timeZone.getID();

Es wird wie gedruckt

Asia/Kolkata
Raja Jawahar
quelle
3

Einfachste Lösung mit einfachem Datumsformat: 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   " );

==> Ausgabe ist: +05: 30

Jaydeep purohit
quelle
2

ZoneId von java.time und ThreeTenABP

Moderne Antwort:

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

Als ich dieses Snippet in der Zeitzone Australien / Sydney ausgeführt habe, war die Ausgabe genau das:

Australia/Sydney

Wenn Sie möchten, dass die Sommerzeit (DST) den Namen oder die Abkürzung der Zeitzone berücksichtigt:

    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

Die TimeZoneKlasse, die in den meisten anderen Antworten verwendet wurde, war die, die wir hatten, als die Frage 2011 gestellt wurde, obwohl sie schlecht gestaltet war. Heute ist es längst veraltet, und ich empfehle, stattdessen java.time zu verwenden, die moderne Java-API für Datum und Uhrzeit, die 2014 veröffentlicht wurde.

Frage: Benötigt java.time nicht Android API Level 26?

java.time funktioniert sowohl auf älteren als auch auf neueren Android-Geräten. Es erfordert nur mindestens Java 6 .

  • In Java 8 und höher und auf neueren Android-Geräten (ab API-Level 26) ist die moderne API integriert.
  • In Nicht-Android Java 6 und 7 erhalten Sie den ThreeTen Backport, den Backport der modernen Klassen (ThreeTen für JSR 310; siehe die Links unten).
  • Verwenden Sie auf (älteren) Android die Android-Edition von ThreeTen Backport. Es heißt ThreeTenABP. Und stellen Sie sicher, dass Sie die Datums- und org.threeten.bpZeitklassen mit Unterpaketen importieren.

Links

Ole VV
quelle
1

Für Geräte mit API 26 und höher können Sie dies folgendermaßen erhalten:

ZonedDateTime.now().getZone().toString();
Maciej Beimcik
quelle
1

Auf meinem Gerät TimeZone.getDefault()wird immer die UTC-Zeitzone zurückgegeben.

Ich muss dies tun, um die vom Benutzer konfigurierte Zeitzone zu erhalten:

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

Die vom Benutzer ausgewählte Zeitzone wird zurückgegeben.

Bipi
quelle
0

Alle Antworten hier scheinen darauf hinzudeuten, den Daylite-Parameter auf false zu setzen . Dies ist für viele Zeitzonen falsch, in denen die abgekürzten Namen je nach Jahreszeit geändert werden (z. B. EST vs EDT).

Die folgende Lösung gibt Ihnen die richtige Abkürzung entsprechend dem aktuellen Datum für die Zeitzone.

val tz = TimeZone.getDefault()
val isDaylite = tz.inDaylightTime(Date())
val timezone = tz.getDisplayName(isDaylite, TimeZone.SHORT)
Dummy-Daten
quelle
Die TimeZoneKlasse ist schlecht gestaltet und längst veraltet.
Ole VV