Bagaimana cara mendapatkan TimeZone dari ponsel Android?

147

Saya ingin mendapatkan zona waktu dari ponsel Android saat mengklik tombol.

asha v
sumber
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); Dan ini adalah kode
asha v
10
Saya tidak akan terlalu kasar pada asha v. Saya hanya mencari hal yang sama dan jawaban yang saya temukan berbeda dari yang ini. Sebenarnya mencari dengan "TimeZone.getDefault" yang tepat membawa saya ke sini.
Yar

Jawaban:

196

Sudahkah Anda mencoba menggunakan TimeZone.getDefault():

Sebagian besar aplikasi akan menggunakan TimeZone.getDefault () yang mengembalikan TimeZone berdasarkan zona waktu tempat program berjalan.

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

MasterCassim
sumber
22
Jika Anda menggunakan JodaTime , Anda bisa mendapatkan DateTimeZone dengan yang berikut ini:DateTimeZone.forTimeZone(TimeZone.getDefault());
Joshua Pinter
@JoshPinter paket mana yang saya gunakan, paket di android.icu.utils atau java.util?
Neon Warge
1
Saya mengubah zona waktu dari perangkat ke CST, itu tidak memberi saya CST kembali. Adakah cara untuk mendapatkan zona waktu, dari perangkat?
Abhinav Saxena
Saya bertanya-tanya, apakah TimeZone.getDefault berlaku jika kita memalsukan zona waktu perangkat. Sepertinya tidak ada di simulator android.
Hau Luu
@NeonWarge Keduanya akan berfungsi, meskipun android.icu hanya berfungsi untuk API 24 ke atas.
Nicolas
139
TimeZone tz = TimeZone.getDefault();
System.out.println("TimeZone   "+tz.getDisplayName(false, TimeZone.SHORT)+" Timezon id :: " +tz.getID());

Keluaran:

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

Zulfiqar
sumber
@Flexo cara mendapatkan cap waktu dari perangkat android
KOUSIK daniel
4
penjelasan yang bagus dengan keluaran
Anand Savjani
14

Saya membutuhkan offset yang tidak hanya mencakup waktu penghematan siang hari tetapi juga sebagai numerial . Berikut adalah kode yang saya gunakan jika ada yang mencari contoh.

Saya mendapat jawaban "3.5" (3:30 ') yang saya harapkan di Teheran, Iran pada musim dingin dan "4,5" (4:30') untuk musim panas.

Saya juga membutuhkannya sebagai string sehingga saya dapat mempostingnya ke server sehingga Anda mungkin tidak memerlukan baris terakhir.

untuk mendapatkan zona waktu saat ini:

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
sumber
1
Itu berhasil untuk saya karena saya hanya berurusan dengan durasi (sebagai stopwatch).
Ahsan
13

Coba kode ini-

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

Ini akan mengembalikan zona waktu yang dipilih pengguna.

anujprashar
sumber
4
Membuat Calendarobjek untuk ini adalah omong kosong. Pembuatan objek jenis ini mahal. TimeZone.getDefault()adalah cara yang tepat untuk mendapatkannya.
anonim
3
@KrLx_roller Harap periksa dengan cermat sebelum menurunkan jawaban. Saya telah menulis jawaban saya mengembalikan zona waktu yang dipilih pengguna sedangkan TimeZone.getDefault () akan mengembalikan zona waktu default instalasi. Untuk info lebih lanjut silakan code.google.com/p/android/issues/detail?id=2037 .
anujprashar
Kode Anda mengembalikan zona waktu yang sama dengan TimeZone.getDefault () di android 4.2. TimeZone.getDefault () akan mengembalikan zona waktu yang dipilih dalam pengaturan -> tanggal & waktu.
pengguna1088166
7
TimeZone timeZone = TimeZone.getDefault(); 
timeZone.getID();

Ini akan mencetak seperti

Asia/Kolkata
Raja Jawahar
sumber
5

ZoneId dari java.time dan ThreeTenABP

Jawaban modern:

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

Ketika saya menjalankan cuplikan ini di zona waktu Australia / Sydney, hasilnya persis seperti itu:

Australia/Sydney

Jika Anda ingin nama atau singkatan zona waktu yang sadar waktu musim panas (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

Itu TimeZone kelas yang digunakan di sebagian besar jawaban yang lain adalah apa yang kita miliki saat pertanyaan diajukan pada 2011, meskipun itu buruk dirancang. Hari ini sudah lama usang, dan saya merekomendasikan agar kita menggunakan java.time, API tanggal dan waktu Java modern yang keluar pada tahun 2014.

Pertanyaan: Bukankah java.time memerlukan Android API level 26?

java.time bekerja dengan baik di perangkat Android lama dan lebih baru. Ini hanya membutuhkan setidaknya Java 6 .

  • Di Java 8 dan yang lebih baru dan pada perangkat Android yang lebih baru (dari API level 26), API modern sudah ada di dalamnya.
  • Di non-Android Java 6 dan 7 dapatkan ThreeTen Backport, backport kelas modern (ThreeTen untuk JSR 310; lihat tautan di bagian bawah).
  • Di Android (lebih lama), gunakan ThreeTen Backport edisi Android. Ini disebut ThreeTenABP. Dan pastikan Anda mengimpor kelas tanggal dan waktu dari org.threeten.bpdengan subpaket.

Tautan

Ole VV
sumber
3

Solusi Paling Sederhana Dengan Format Tanggal Sederhana: 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   " );

==> Outputnya adalah: +05: 30

Jaydeep purohit
sumber
2

Di perangkat saya TimeZone.getDefault()selalu mengembalikan zona waktu UTC.

Saya perlu melakukan ini untuk mendapatkan zona waktu yang dikonfigurasi pengguna:

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

Ini akan mengembalikan zona waktu yang dipilih pengguna.

Bipi
sumber
1

Untuk perangkat dengan API 26 dan lebih tinggi, Anda bisa mendapatkannya seperti ini:

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

Semua jawaban di sini tampaknya menyarankan pengaturan parameter daylite ke false . Ini tidak benar untuk banyak zona waktu yang mengubah nama singkatan tergantung pada waktu tahun (mis. EST vs EDT).

Solusi di bawah ini akan memberi Anda singkatan yang benar menurut tanggal saat ini untuk zona waktu.

val tz = TimeZone.getDefault()
val isDaylite = tz.inDaylightTime(Date())
val timezone = tz.getDisplayName(isDaylite, TimeZone.SHORT)
DummyData
sumber
The TimeZonekelas buruk dirancang dan panjang usang.
Ole VV