Cara Menetapkan Zon Waktu JVM

1. Gambaran keseluruhan

Pengguna aplikasi kami boleh menjadi tuntutan ketika datang ke cap waktu. Mereka mengharapkan aplikasi kami mengesan zon waktu mereka secara automatik, dan memaparkan cap waktu di zon waktu yang betul.

Dalam tutorial ini, kita akan melihat beberapa cara untuk mengubah zon waktu JVM . Kami juga akan belajar mengenai beberapa perangkap yang berkaitan dengan pengurusan zon waktu.

2. Pengenalan Zon Waktu

Secara lalai, JVM membaca maklumat zon waktu dari sistem operasi. Maklumat ini dihantar ke kelas TimeZone , yang menyimpan zon waktu dan mengira waktu penjimatan siang .

Kita boleh memanggil kaedah getDefault, yang akan mengembalikan zon waktu di mana program dijalankan. Selanjutnya, kita dapat memperoleh senarai ID zon waktu yang disokong dari aplikasi menggunakan TimeZone.getAvailableIDs () .

Semasa menamakan zon waktu, Java bergantung pada konvensyen penamaan pangkalan data tz .

3. Mengubah Zon Waktu

Pada bahagian ini, kita akan melihat beberapa cara untuk mengubah zon waktu di JVM.

3.1. Menetapkan Pembolehubah Persekitaran

Mari mulakan dengan melihat bagaimana kita dapat menggunakan pemboleh ubah persekitaran untuk mengubah zon waktu. Kita boleh menambah atau mengubah TZ pemboleh ubah persekitaran .

Sebagai contoh, dalam persekitaran berasaskan Linux, kita boleh menggunakan arahan eksport :

export TZ="America/Sao_Paulo"

Setelah menetapkan pemboleh ubah persekitaran, kita dapat melihat bahawa zon waktu aplikasi yang sedang berjalan sekarang adalah America / Sao_Paulo:

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

3.2. Menetapkan Hujah JVM

Alternatif untuk menetapkan pemboleh ubah persekitaran adalah menetapkan argumen JVM user.timezone . Hujah JVM ini diutamakan daripada pemboleh ubah persekitaran TZ .

Sebagai contoh, kita boleh menggunakan flag -D semasa menjalankan aplikasi kita:

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

Begitu juga, kita juga dapat menetapkan argumen JVM dari aplikasi :

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

Kita sekarang dapat melihat bahawa zon waktu adalah Asia / Kolkata:

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

3.3. Menetapkan Zon Waktu Dari Aplikasi

Akhirnya, kita juga dapat mengubah zon waktu JVM dari aplikasi menggunakan kelas TimeZone . Pendekatan ini mendahului kedua-dua pemboleh ubah persekitaran dan argumen JVM.

Menetapkan zon waktu lalai adalah mudah:

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

Seperti yang dijangkakan, zon waktu sekarang adalah Portugal :

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

4. Perangkap

4.1. Menggunakan ID Zon Waktu Tiga Huruf

Walaupun menggunakan tiga huruf ID untuk mewakili zon waktu, ia tidak digalakkan.

Sebaliknya, kita harus menggunakan nama yang lebih panjang, kerana ID tiga huruf tidak jelas. Sebagai contoh, IST boleh menjadi Waktu Piawai India, Waktu Piawai Ireland atau Waktu Piawai Israel.

4.2. Tetapan global

Perhatikan bahawa setiap pendekatan di atas adalah menetapkan zon waktu secara global untuk keseluruhan aplikasi. Walau bagaimanapun, dalam aplikasi moden, menetapkan zon waktu lebih bernuansa daripada itu.

Sebagai contoh, kita mungkin perlu menerjemahkan masa ke zon waktu pengguna akhir, dan jadi zon waktu global tidak masuk akal. Sekiranya zon waktu global tidak diperlukan, pertimbangkan untuk menentukan zon waktu secara langsung pada setiap contoh tarikh-waktu. Sama ada ZonedDateTime atau OffsetDateTime adalah kelas yang berguna untuk ini.

5. Kesimpulan

Dalam tutorial ini, kami menerangkan beberapa cara untuk mengubah zon waktu JVM. Kami melihat bahawa kami dapat menetapkan pemboleh ubah persekitaran seluruh sistem, mengubah argumen JVM atau mengubahnya secara terprogram dari aplikasi kami.

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