Come ottenere TimeZone dal cellulare Android?


140

Voglio ottenere il fuso orario dal cellulare Android quando si fa clic su un pulsante.


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); E questo è il codice
asha v

10
Non sarei così duro con Asha V. Stavo solo cercando la stessa cosa e le risposte che ho trovato erano diverse da quelle. In realtà la ricerca esatta "TimeZone.getDefault" mi ha portato qui.
Yar

Risposte:


189

Hai provato a usare TimeZone.getDefault():

La maggior parte delle applicazioni utilizzerà TimeZone.getDefault () che restituisce un fuso orario in base al fuso orario in cui è in esecuzione il programma.

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


22
Se stai usando JodaTime , puoi ottenere un DateTimeZone con il seguente:DateTimeZone.forTimeZone(TimeZone.getDefault());
Joshua Pinter,

@JoshPinter quale pacchetto devo usare, quello su android.icu.utils o java.util?
Neon Warge,

1
Ho cambiato il fuso orario dal dispositivo a CST, non mi sta restituendo CST. C'è un modo per ottenere il fuso orario del dispositivo?
Abhinav Saxena,

Mi chiedo, TimeZone.getDefault viene effettuato se in qualche modo falsiamo il fuso orario del dispositivo. Sembra non essere sul simulatore Android.
Hau Luu, il

@NeonWarge Entrambi funzioneranno, sebbene android.icu funzioni solo per API 24 e successive.
Nicolas

136
TimeZone tz = TimeZone.getDefault();
System.out.println("TimeZone   "+tz.getDisplayName(false, TimeZone.SHORT)+" Timezon id :: " +tz.getID());

Produzione:

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


@Flexo come ottenere il timestamp dal dispositivo Android
KOUSIK daniel

4
grande spiegazione con uscita
Anand Savjani


14

Avevo bisogno dell'offset che includeva non solo l'ora legale, ma come un numero . Ecco il codice che ho usato nel caso qualcuno stia cercando un esempio.

Ricevo una risposta di "3,5" (3:30 ') che è quello che mi aspetterei a Teheran, in Iran in inverno e "4.5" (4:30') per l'estate.

Ne avevo anche bisogno come stringa in modo da poterlo pubblicare su un server in modo da non aver bisogno dell'ultima riga.

per ottenere il fuso orario currect:

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);

1
Ha funzionato per me dato che mi occupavo solo di durate (come cronometro).
Ahsan,

13

Prova questo codice

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

Restituirà il fuso orario selezionato dall'utente.


4
La creazione di un Calendaroggetto per questo è una sciocchezza. La creazione di questo tipo di oggetto è costosa. TimeZone.getDefault()è il modo appropriato per ottenere questo.
anonimo

3
@KrLx_roller Si prega di controllare attentamente prima di effettuare il downgrade della risposta. Ho scritto la mia risposta restituisce il fuso orario selezionato dall'utente mentre TimeZone.getDefault () restituirà il fuso orario predefinito dell'installazione. Per maggiori informazioni, code.google.com/p/android/issues/detail?id=2037 .
anujprashar,

Il tuo codice restituisce lo stesso fuso orario di TimeZone.getDefault () su Android 4.2. TimeZone.getDefault () restituirà il fuso orario selezionato nelle impostazioni -> data e ora.
user1088166

5
TimeZone timeZone = TimeZone.getDefault(); 
timeZone.getID();

Stampa come

Asia/Kolkata

3

Soluzione più semplice con formato data semplice: 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   " );

==> L'output è: +05: 30



2

ZoneId da java.time e ThreeTenABP

Risposta moderna:

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

Quando ho eseguito questo snippet nel fuso orario di Australia / Sydney, l'output era esattamente questo:

Australia/Sydney

Se si desidera il nome del fuso orario o l'ora abbreviata dell'ora legale (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

La TimeZoneclasse utilizzata nella maggior parte delle altre risposte era quella che avevamo quando la domanda è stata posta nel 2011, anche se era stata progettata male. Oggi è obsoleto da tempo e raccomando invece di usare java.time, la moderna API di data e ora di Java che è stata lanciata nel 2014.

Domanda: java.time non richiede l'API Android livello 26?

java.time funziona perfettamente su dispositivi Android vecchi e nuovi. Richiede solo almeno Java 6 .

  • In Java 8 e versioni successive e su dispositivi Android più recenti (dal livello API 26) l'API moderna è integrata.
  • In Java 6 e 7 non Android ottieni il ThreeTen Backport, il backport delle classi moderne (ThreeTen per JSR 310; vedi i link in basso).
  • Su (vecchi) Android usa l'edizione Android di ThreeTen Backport. Si chiama ThreeTenABP. E assicurati di importare le classi di data e ora org.threeten.bpcon i pacchetti secondari.

link


1

Per i dispositivi con API 26 e successive, puoi ottenerlo in questo modo:

ZonedDateTime.now().getZone().toString();

1

Sul mio dispositivo TimeZone.getDefault()restituisce sempre il fuso orario UTC.

Devo farlo per ottenere il fuso orario configurato dall'utente:

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

Restituirà il fuso orario selezionato dall'utente.


0

Tutte le risposte qui sembrano suggerire di impostare il parametro daylite su false . Ciò non è corretto per molti fusi orari che cambiano i nomi abbreviati a seconda del periodo dell'anno (ad esempio EST vs EDT).

La soluzione seguente ti fornirà l'abbreviazione corretta in base alla data corrente per il fuso orario.

val tz = TimeZone.getDefault()
val isDaylite = tz.inDaylightTime(Date())
val timezone = tz.getDisplayName(isDaylite, TimeZone.SHORT)

La TimeZoneclasse è mal progettata e obsoleta da tempo.
Ole VV,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.