Como obter o TimeZone do Android Mobile?

139

Quero obter o fuso horário no celular Android ao clicar em um botão.

asha v
fonte
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", "Fuso Horário:" + gmt1 + "\ t" + gmt2); E este é o código
asha v
10
Eu não seria tão duro com asha v. Eu estava apenas procurando a mesma coisa e as respostas que encontrei foram diferentes dessas. Na verdade, pesquisar pelo exato "TimeZone.getDefault" me levou aqui.
Yar

Respostas:

189

Você já tentou usar TimeZone.getDefault():

A maioria dos aplicativos usa o TimeZone.getDefault (), que retorna um TimeZone com base no fuso horário em que o programa está sendo executado.

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

MasterCassim
fonte
22
Se você estiver usando o JodaTime , poderá obter um DateTimeZone com o seguinte:DateTimeZone.forTimeZone(TimeZone.getDefault());
Joshua Pinter
@ JoshPinter qual pacote devo usar, o do android.icu.utils ou o java.util?
Neon Warge
1
Alterei o fuso horário do dispositivo para CST, ele não está me devolvendo o CST. Existe uma maneira de obter o fuso horário do dispositivo?
Abhinav Saxena
Gostaria de saber se o TimeZone.getDefault será afetado se, de alguma forma, forjarmos o fuso horário do dispositivo. Parece não estar no simulador do Android.
Hau Luu
136
TimeZone tz = TimeZone.getDefault();
System.out.println("TimeZone   "+tz.getDisplayName(false, TimeZone.SHORT)+" Timezon id :: " +tz.getID());

Resultado:

Fuso horário GMT + 09:30 id do fuso horário :: Austrália / Darwin

Zulfiqar
fonte
@Flexo how to timestamp from android device
KOUSIK daniel
4
grande explicação com saída
Anand Savjani
14

Eu precisava da compensação que incluísse não apenas o horário de verão, mas também numérico . Aqui está o código que eu usei no caso de alguém procurar um exemplo.

Eu recebo uma resposta de "3.5" (3:30 '), o que eu esperaria em Teerã, Irã no inverno e "4.5" (4:30') no verão.

Eu também precisava disso como uma string para que eu pudesse publicá-la em um servidor, para que você não precise da última linha.

para obter o fuso horário atual:

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
fonte
1
Funcionou para mim, pois eu estava lidando apenas com durações (como um cronômetro).
Ahsan
13

Experimente este código-

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

Ele retornará o fuso horário selecionado pelo usuário.

anujprashar
fonte
4
Criar um Calendarobjeto para isso é um absurdo. A criação desse tipo de objeto é cara. TimeZone.getDefault()é a maneira apropriada de conseguir isso.
anonymous
3
@KrLx_roller Por favor, verifique cuidadosamente antes de responder a uma votação negativa. Escrevi que minha resposta retorna o fuso horário selecionado pelo usuário, enquanto TimeZone.getDefault () retornará o fuso horário padrão da instalação. Para mais informações, code.google.com/p/android/issues/detail?id=2037 .
precisa saber é o seguinte
Seu código retorna o mesmo fuso horário que TimeZone.getDefault () no android 4.2. TimeZone.getDefault () retornará o fuso horário selecionado nas configurações -> data e hora.
user1088166
5
TimeZone timeZone = TimeZone.getDefault(); 
timeZone.getID();

Imprimirá como

Asia/Kolkata
Raja Jawahar
fonte
3

Solução mais simples com formato simples de data: 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   " );

==> A saída é: +0: 30

Jaydeep purohit
fonte
2

ZoneId de java.time e ThreeTenABP

Resposta moderna:

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

Quando executei esse trecho no fuso horário da Austrália / Sydney, a saída foi exatamente a seguinte:

Australia/Sydney

Se você deseja o nome ou a abreviação do fuso horário com horário de verão (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

A TimeZoneclasse usada na maioria das outras respostas foi a que tínhamos quando a pergunta foi feita em 2011, apesar de ter sido mal projetada. Hoje está desatualizado há muito tempo, e eu recomendo que, em vez disso, usemos java.time, a moderna API de data e hora do Java que foi lançada em 2014.

Pergunta: O java.time não requer a API do Android nível 26?

O java.time funciona bem em dispositivos Android mais antigos e mais recentes. Requer apenas pelo menos Java 6 .

  • No Java 8 e posterior e em dispositivos Android mais recentes (do nível 26 da API), a API moderna é incorporada.
  • Nos Java 6 e 7 não Android, obtenha o ThreeTen Backport, o backport das classes modernas (ThreeTen para JSR 310; veja os links na parte inferior).
  • No Android (mais antigo), use a edição Android do ThreeTen Backport. Chama-se ThreeTenABP. E certifique-se de importar as classes de data e hora org.threeten.bpcom subpacotes.

Ligações

Ole VV
fonte
1

Para dispositivos com API 26 e superior, você pode obtê-lo assim:

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

No meu dispositivo TimeZone.getDefault() está sempre retornando o fuso horário UTC.

Preciso fazer isso para obter o fuso horário configurado pelo usuário:

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

Ele retornará o fuso horário selecionado pelo usuário.

Bipi
fonte
0

Todas as respostas aqui parecem sugerir a configuração do parâmetro daylite como false . Isso está incorreto para muitos fusos horários que alteram nomes abreviados, dependendo da época do ano (por exemplo, EST vs EDT).

A solução abaixo fornecerá a abreviação correta de acordo com a data atual do fuso horário.

val tz = TimeZone.getDefault()
val isDaylite = tz.inDaylightTime(Date())
val timezone = tz.getDisplayName(isDaylite, TimeZone.SHORT)
Dados fictícios
fonte
A TimeZoneclasse é mal projetada e desatualizada há muito tempo.
VV Ole VV