Cara Mengatur Zona Waktu JVM

1. Ikhtisar

Pengguna aplikasi kami bisa jadi banyak menuntut dalam hal cap waktu. Mereka mengharapkan aplikasi kami mendeteksi zona waktu mereka secara otomatis, dan menampilkan cap waktu di zona waktu yang benar.

Dalam tutorial ini, kita akan melihat beberapa cara untuk mengubah zona waktu JVM . Kami juga akan mempelajari tentang beberapa kendala yang terkait dengan pengelolaan zona waktu.

2. Pengantar Zona Waktu

Secara default, JVM membaca informasi zona waktu dari sistem operasi. Informasi ini diteruskan ke kelas TimeZone , yang menyimpan zona waktu dan menghitung waktu musim panas .

Kita dapat memanggil metode getDefault, yang akan mengembalikan zona waktu tempat program berjalan. Selain itu, kami dapat memperoleh daftar ID zona waktu yang didukung dari aplikasi menggunakan TimeZone.getAvailableIDs () .

Saat memberi nama zona waktu, Java bergantung pada konvensi penamaan database tz .

3. Mengubah Zona Waktu

Di bagian ini, kita akan melihat beberapa cara untuk mengubah zona waktu di JVM.

3.1. Menetapkan Variabel Lingkungan

Mari kita mulai dengan melihat bagaimana kita dapat menggunakan variabel lingkungan untuk mengubah zona waktu. Kita dapat menambah atau memodifikasi TZ variabel lingkungan .

Misalnya, di lingkungan berbasis Linux, kita dapat menggunakan perintah ekspor :

export TZ="America/Sao_Paulo"

Setelah mengatur variabel lingkungan, kita dapat melihat bahwa zona waktu dari aplikasi kita yang sedang berjalan sekarang adalah America / Sao_Paulo:

Calendar calendar = Calendar.getInstance(); assertEquals(calendar.getTimeZone(), TimeZone.getTimeZone("America/Sao_Paulo"));

3.2. Menyetel Argumen JVM

Alternatif untuk menyetel variabel lingkungan adalah menyetel argumen JVM zona waktu pengguna . Argumen JVM ini lebih diutamakan daripada variabel lingkungan TZ .

Misalnya, kita bisa menggunakan flag -D saat menjalankan aplikasi kita:

java -Duser.timezone="Asia/Kolkata" com.company.Main

Demikian juga, kita juga bisa menyetel argumen JVM dari aplikasi :

System.setProperty("user.timezone", "Asia/Kolkata");

Sekarang kita dapat melihat bahwa zona waktunya adalah Asia / Kolkata:

Calendar calendar = Calendar.getInstance(); assertEquals(calendar.getTimeZone(), TimeZone.getTimeZone("Asia/Kolkata"));

3.3. Mengatur Zona Waktu Dari Aplikasi

Terakhir, kami juga dapat mengubah zona waktu JVM dari aplikasi menggunakan kelas TimeZone . Pendekatan ini lebih diutamakan daripada variabel lingkungan dan argumen JVM.

Menyetel zona waktu default itu mudah:

TimeZone.setDefault(TimeZone.getTimeZone("Portugal"));

Seperti yang diharapkan, zona waktunya sekarang adalah Portugal :

Calendar calendar = Calendar.getInstance(); assertEquals(calendar.getTimeZone(), TimeZone.getTimeZone("Portugal"));

4. Jebakan

4.1. Menggunakan ID Zona Waktu Tiga huruf

Meskipun ID tiga huruf dapat digunakan untuk mewakili zona waktu, hal itu tidak disarankan.

Sebagai gantinya, kita harus menggunakan nama yang lebih panjang, karena ID tiga huruf itu ambigu. Misalnya, IST dapat berupa Waktu Standar India, Waktu Standar Irlandia, atau Waktu Standar Israel.

4.2. Pengaturan global

Perhatikan bahwa setiap pendekatan di atas menyetel zona waktu secara global untuk seluruh aplikasi. Namun, dalam aplikasi modern, pengaturan zona waktu seringkali lebih bernuansa daripada itu.

Misalnya, kita mungkin perlu menerjemahkan waktu ke zona waktu pengguna akhir, sehingga zona waktu global tidak akan masuk akal. Jika zona waktu global tidak diperlukan, pertimbangkan untuk menentukan zona waktu secara langsung di setiap contoh tanggal-waktu. Baik ZonedDateTime atau OffsetDateTime adalah kelas yang berguna untuk ini.

5. Kesimpulan

Dalam tutorial ini, kami menjelaskan beberapa cara untuk mengubah zona waktu JVM. Kami melihat bahwa kami dapat menyetel variabel lingkungan seluruh sistem, mengubah argumen JVM, atau memodifikasinya secara terprogram dari aplikasi kami.

Seperti biasa, semua contoh yang digunakan dalam artikel ini tersedia di GitHub.