Android mobil cihazdan TimeZone nasıl alınır?


140

Bir düğmeyi tıkladığınızda Android cep telefonundan saat dilimi almak istiyorum.


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 ("Etiket", "Saat Dilimi:" + gmt1 + "\ t" + gmt2); Ve bu kod
asha v

10
Ben asha v için o kadar kaba olmazdım. Ben sadece aynı şeyi arıyordum ve bulduğum cevaplar bunlardan farklıydı. Aslında tam olarak "TimeZone.getDefault" araması beni buraya getirdi.
Yar

Yanıtlar:


190

Kullanmaya çalıştınız mı TimeZone.getDefault():

Çoğu uygulama , programın çalıştığı saat dilimine göre bir TimeZone döndüren TimeZone.getDefault () yöntemini kullanır .

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


22
JodaTime kullanıyorsanız , aşağıdakileri içeren bir DateTimeZone alabilirsiniz:DateTimeZone.forTimeZone(TimeZone.getDefault());
Joshua Pinter

@JoshPinter android.icu.utils veya java.util'de hangi paketi kullanacağım?
Neon Warge

1
Saat dilimini cihazdan CST'ye değiştirdim, bana CST'yi geri vermiyor. Cihazın saat dilimini almanın bir yolu var mı?
Abhinav Saxena

Merak ediyorum, bir şekilde cihazın saat dilimini taklit edersek, TimeZone.getDefault etkilenir mi? Android simülatöründe değil gibi görünüyor.
Hau Luu

@NeonWarge Her ikisi de çalışır, ancak android.icu yalnızca API 24 ve üstü için çalışır.
Nicolas

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

Çıktı:

Saat Dilimi GMT + 09: 30 Timezon kimliği :: Avustralya / Darwin


@Flexo android cihazdan zaman damgası nasıl alınır
KOUSIK daniel

4
çıktı ile büyük açıklama
Anand Savjani


14

Ben gerekli ofset sadece dahil gün ışığı tasarruf süresini olduğunu ancak olarak numerial . İşte birisi örnek aramak durumunda kullandığım kod.

Tahran, İran'da kışın beklediğim "3.5" (3:30 ') ve yaz için "4.5" (4:30') yanıtı alıyorum .

Ben de bir dize olarak gerekli böylece son satır gerek olmayabilir bir sunucuya gönderebilir.

akım saat dilimi almak için:

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
Sadece sürelerle uğraşırken benim için çalıştı (bir kronometre olarak).
Ahsan

13

Bu kodu deneyin-

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

Kullanıcı tarafından seçilen saat dilimini döndürür.


4
Bunun Calendariçin bir nesne yaratmak saçmalıktır. Bu tür nesnelerin oluşturulması pahalıdır. TimeZone.getDefault()bunu elde etmenin uygun yoludur.
anonim

3
@KrLx_roller Cevabı indirmeden önce lütfen dikkatlice kontrol edin. Ben wrtitten cevabım kullanıcı seçilen zaman dilimi döndürür oysa TimeZone.getDefault () yükleme varsayılan zaman dilimi dönecektir. Daha fazla bilgi için lütfen code.google.com/p/android/issues/detail?id=2037 .
anujprashar

Kodunuz android 4.2'de TimeZone.getDefault () ile aynı saat dilimini döndürür. TimeZone.getDefault (), ayarlar -> tarih ve saat'te seçilen saat dilimini döndürür.
user1088166

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

Gibi yazdırılacak

Asia/Kolkata

3

Basit Tarih Formatıyla En Basit Çözüm: 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   " );

==> Çıktı: +05: 30



2

Java.time ve ThreeTenABP'den ZoneId

Modern cevap:

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

Bu snippet'i Avustralya / Sidney saat diliminde çalıştırdığımda çıktı tam olarak şuydu:

Australia/Sydney

Yaz saati (DST) saat dilimi adını veya kısaltmasını istiyorsanız:

    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

TimeZoneDiğer cevapların çoğunda kullanılan sınıf soru 2011 yılında sorulduğunda biz kötü tasarlanmış olmasına rağmen, ne vardı oldu. Bugün çok eskidir ve bunun yerine 2014 yılında çıkan modern Java tarih ve saat API'sı java.time'ı kullanmanızı öneririz.

Soru: Java.time, Android API düzey 26'yı gerektirmiyor mu?

java.time hem eski hem de yeni Android cihazlarda güzel çalışıyor. Sadece en az Java 6 gerektirir .

  • Java 8 ve sonraki sürümlerde ve daha yeni Android cihazlarda (API düzey 26'dan) modern API yerleşik olarak gelir.
  • Android olmayan Java 6 ve 7'de modern sınıfların backport'u ThreeTen Backport'u edinin (JSR 310 için ThreeTen; alttaki bağlantılara bakın).
  • (Daha eski) Android cihazlarında ThreeTen Backport'un Android sürümünü kullanın. Buna ThreeTenABP deniyor. Ve tarih ve saat sınıflarını org.threeten.bpalt paketlerle aldığınızdan emin olun .

Bağlantılar


1

API 26 ve sonraki sürümlere sahip cihazlar için şu şekilde alabilirsiniz:

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

1

Cihazımda TimeZone.getDefault()her zaman UTC saat dilimi dönüyor.

Kullanıcı yapılandırılmış saat dilimi almak için bunu yapmak gerekir:

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

Kullanıcı tarafından seçilen saat dilimini döndürür.


0

Buradaki tüm cevaplar daylite parametresinin false olarak ayarlanmasını önermektedir . Bu, yılın zamanına bağlı olarak kısaltılmış adları değiştiren birçok zaman dilimi için yanlıştır (örn. EST ve EDT).

Aşağıdaki çözüm, saat diliminin geçerli tarihine göre size doğru kısaltmayı verecektir.

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

TimeZoneSınıf kötü tasarlanmış ve uzun modası geçmiş olduğunu.
Ole VV
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.