Come impostare il fuso orario JVM

1. Panoramica

Gli utenti delle nostre applicazioni possono essere esigenti quando si tratta di timestamp. Si aspettano che le nostre applicazioni rilevano automaticamente i loro fusi orari e visualizzano i timestamp nel fuso orario corretto.

In questo tutorial, daremo un'occhiata a diversi modi in cui possiamo modificare il fuso orario della JVM . Impareremo anche alcune delle insidie ​​associate alla gestione del fuso orario.

2. Introduzione al fuso orario

Per impostazione predefinita, la JVM legge le informazioni sul fuso orario dal sistema operativo. Queste informazioni vengono passate alla classe TimeZone , che memorizza il fuso orario e calcola l'ora legale .

Possiamo chiamare il metodo getDefault, che restituirà il fuso orario in cui è in esecuzione il programma. Inoltre, è possibile ottenere un elenco di ID di fuso orario supportati dall'applicazione utilizzando TimeZone.getAvailableIDs () .

Quando si assegna un nome al fuso orario, Java si basa sulla convenzione di denominazione del database tz .

3. Modifica del fuso orario

In questa sezione, daremo un'occhiata a diversi modi in cui possiamo cambiare il fuso orario nella JVM.

3.1. Impostazione di una variabile d'ambiente

Cominciamo vedendo come possiamo usare una variabile d'ambiente per cambiare il fuso orario. Possiamo aggiungere o modificare una variabile d'ambiente TZ.

Ad esempio, in ambienti basati su Linux, possiamo utilizzare il comando export :

export TZ="America/Sao_Paulo"

Dopo aver impostato la variabile d'ambiente, possiamo vedere che il fuso orario della nostra applicazione in esecuzione è ora America / Sao_Paulo:

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

3.2. Impostazione di un argomento JVM

Un'alternativa all'impostazione di una variabile di ambiente è l'impostazione dell'argomento JVM user.timezone . Questo argomento JVM ha la precedenza sulla variabile di ambiente TZ .

Ad esempio, possiamo usare il flag -D quando eseguiamo la nostra applicazione:

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

Allo stesso modo, possiamo anche impostare l'argomento JVM dall'applicazione :

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

Ora possiamo vedere che il fuso orario è Asia / Kolkata:

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

3.3. Impostazione del fuso orario dall'applicazione

Infine, possiamo anche modificare il fuso orario JVM dall'applicazione utilizzando la classe TimeZone . Questo approccio ha la precedenza sia sulla variabile di ambiente che sull'argomento JVM.

Impostare il fuso orario predefinito è facile:

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

Come previsto, il fuso orario è ora il Portogallo :

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

4. Insidie

4.1. Utilizzo di ID di fuso orario di tre lettere

Anche se è possibile utilizzare ID di tre lettere per rappresentare il fuso orario, non è consigliabile.

Invece, dovremmo usare i nomi più lunghi, poiché gli ID di tre lettere sono ambigui. Ad esempio, IST potrebbe essere l'ora solare dell'India, l'ora solare irlandese o l'ora solare di Israele.

4.2. Impostazioni globali

Si noti che ciascuno degli approcci precedenti imposta il fuso orario a livello globale per l'intera applicazione. Nelle applicazioni moderne, tuttavia, l'impostazione del fuso orario è spesso più sfumata di così.

Ad esempio, probabilmente dobbiamo tradurre l'ora nel fuso orario dell'utente finale, quindi un fuso orario globale non avrebbe molto senso. Se non è necessario un fuso orario globale, valuta la possibilità di specificare il fuso orario direttamente su ciascuna istanza di data e ora. Sia ZonedDateTime o OffsetDateTime è una classe utile per questo.

5. conclusione

In questo tutorial, abbiamo spiegato diversi modi per modificare il fuso orario della JVM. Abbiamo visto che potevamo impostare una variabile d'ambiente a livello di sistema, cambiare un argomento JVM o modificarlo a livello di codice dalla nostra applicazione.

Come al solito, tutti gli esempi utilizzati in questo articolo sono disponibili su GitHub.