Quero obter o fuso horário no celular Android ao clicar em um botão.
Quero obter o fuso horário no celular Android ao clicar em um botão.
Respostas:
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
DateTimeZone.forTimeZone(TimeZone.getDefault());
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
Edit: corrigido o caso
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);
Experimente este código-
Calendar cal = Calendar.getInstance();
TimeZone tz = cal.getTimeZone();
Ele retornará o fuso horário selecionado pelo usuário.
Calendar
objeto para isso é um absurdo. A criação desse tipo de objeto é cara. TimeZone.getDefault()
é a maneira apropriada de conseguir isso.
TimeZone timeZone = TimeZone.getDefault();
timeZone.getID();
Imprimirá como
Asia/Kolkata
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
De acordo com http://developer.android.com/reference/android/text/format/Time.html, você deve usar Time.getCurrentTimezone () para recuperar o fuso horário atual do dispositivo.
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 TimeZone
classe 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.
O java.time funciona bem em dispositivos Android mais antigos e mais recentes. Requer apenas pelo menos Java 6 .
org.threeten.bp
com subpacotes.java.time
foi descrito pela primeira vez.java.time
para Java 6 e 7 (ThreeTen para JSR-310).Para dispositivos com API 26 e superior, você pode obtê-lo assim:
ZonedDateTime.now().getZone().toString();
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)
TimeZone
classe é mal projetada e desatualizada há muito tempo.