Cómo configurar una zona horaria JVM correctamente

141

Estoy tratando de ejecutar un programa Java, pero está tomando una zona horaria GMT predeterminada en lugar de una zona horaria definida por el sistema operativo. Mi versión JDK es 1.5 y el sistema operativo es Windows Server Enterprise (2007)

Windows tiene una zona horaria central especificada, pero cuando ejecuto el siguiente programa, me da una hora GMT.

import java.util.Calendar;

public class DateTest
{
    public static void main(String[] args)
    {
        Calendar now = Calendar.getInstance();
        System.out.println(now.getTimeZone());
        System.out.println(now.getTime());
    }
}

Aquí está la salida

sun.util.calendar.ZoneInfo[id="GMT",
offset=0,
dstSavings=0,
useDaylight=false,
transitions=0,
lastRule=null]
Mon Mar 22 13:46:45 GMT 2010

Tenga en cuenta que no quiero establecer la zona horaria desde la aplicación. Quiero que la zona horaria utilizada por JVM sea la especificada en el sistema operativo. (No encuentro estos problemas con otros servidores que tienen la versión 1.4 de JDK y Microsoft Server 2003).

Cualquier pensamiento sería muy apreciado.

Kushal Paudyal
fuente
1
Hm, eso es extraño. Parece un error de JVM / OS o alguna extraña configuración incorrecta.
Michael Borgwardt
¿Cómo estás invocando a la DateTestclase?
mate b
@matt b: estoy compilando y llamando a DateTest desde el símbolo del sistema de Windows. Pero esto es solo una clase de prueba. El problema original era con algún proceso ETL para el servidor IBM Cognos.
Kushal Paudyal
1
solo quería descartar lanzarlo a través de cualquier script de shell / lote que pudiera estar pasando un -Duser.timezonevalor
matt b

Respuestas:

220

Puedes pasar la JVM este parámetro

-Duser.timezone

Por ejemplo

-Duser.timezone=Europe/Sofia

y esto debería hacer el truco. Establecer la variable de entorno TZ también hace el truco en Linux.

Bozhidar Batsov
fuente
Tuvimos que usar la herramienta de actualización de zona horaria JDK DST - 1.3.25 (tzupdater) y luego cambiar el parámetro JVM como sugirió y finalmente nos deshicimos del problema. Por cierto, la información de zona horaria es almacenada por Windows en algún registro. El actualizador que utilicé también actualizó los valores del registro.
Kushal Paudyal
1
Estoy tratando de iniciar mi JVM usando este parámetro, pero parece que no hay cambios ... Si quiero comenzar en UTC, ¿qué debo usar como parámetro?
rafa.ferreira
En mi aplicación, estoy cambiando algunas ubicaciones y obteniendo zonas horarias de esas ubicaciones. Usando la zona horaria que estoy procesando aún más. Pero cuando la aplicación se inicia por primera vez, obtengo los valores correctos. Cuando cambio la zona horaria y establezco la nueva zona horaria como la zona horaria predeterminada, no obtengo los valores correctos. ¿Cuál es el problema? Cómo cambiar la zona horaria exactamente. Estoy cambiando la zona horaria usando TimeZone.setDefault (TimeZone.getTimeZone ("my_time_zone"));
Dray
2
Una lista de las zonas horarias para TZ está aquí: en.wikipedia.org/wiki/List_of_tz_database_time_zones . Usar el nombre de la zona horaria es mejor que el desplazamiento porque manejará el horario de verano.
Brian
65

También puede establecer la zona horaria predeterminada en su código utilizando el siguiente código.

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

A tí

 TimeZone.setDefault(TimeZone.getTimeZone("Europe/Sofia"));
Ali786
fuente
1
"Tenga en cuenta que no quiero establecer la zona horaria desde la aplicación".
AbVog
22

La respuesta aceptada arriba:

-Duser.timezone="Europe/Sofia" 

No funcionó para mí exactamente. Solo pude cambiar con éxito mi zona horaria cuando no tenía comillas alrededor de los parámetros:

-Duser.timezone=Europe/Sofia
WN4yhihiY
fuente
2
Estoy de acuerdo. He editado la respuesta original para eliminar las comillas.
GaZ
1
Esto depende del shell utilizado.
vadipp
10

En Windows 7 y para JDK6, tuve que agregar -Duser.timezone="Europe/Sofia"a la variable de sistema JAVA_TOOL_OPTIONS ubicada en "Mi computadora => Propiedades => Configuración avanzada del sistema => Variables de entorno".

Si ya tiene alguna otra propiedad establecida, JAVA_TOOL_OPTIONSsolo agregue un espacio y luego inserte su cadena de propiedad.

VolkanT
fuente
5

Dos opciones que no creo que se cubrieron en las otras respuestas:

Evitar la necesidad

Independientemente de lo que haga para configurar la zona horaria predeterminada de JVM, es muy difícil asegurarse de que nadie más la configure de manera diferente. Se puede configurar en cualquier momento sin previo aviso desde otra parte de su programa o desde otro programa que se ejecute en la misma JVM. Por lo tanto, en sus operaciones horarias sea explícito sobre la zona horaria que desea, y siempre sabrá lo que obtiene independientemente de la configuración de JVM. Ejemplo:

    System.out.println(ZonedDateTime.now(ZoneId.of("Asia/Dushanbe")));

Salida de ejemplo:

2018-10-11T14: 59: 16.742020 + 05: 00 [Asia / Dushanbe]

System.setProperty

Para muchos propósitos, lo siguiente no será la forma preferida, y ciertamente puede ser mal utilizado. Para los programas de "descarte", a veces me resulta práctico. También puede establecer una propiedad del sistema desde Java:

    System.setProperty("user.timezone", "Australia/Tasmania");
    System.out.println(ZonedDateTime.now());

Esto acaba de imprimir:

2018-10-11T21: 03: 12.218959 + 11: 00 [Australia / Tasmania]

Si desea validar la cadena que está pasando, use:

        System.setProperty("user.timezone", ZoneId.of("Australia/Tasmania").getId());
Ole VV
fuente
4

Si estás usando Maven :

mvn -Dexec.args="-Duser.timezone=Europe/Sofia ....."
MichalSv
fuente
mvn spring-boot:run -Drun.jvmArguments="-Duser.timezone=UTC"para Spring Boot v1.
Chloe el
0

En win7, si desea establecer la zona horaria correcta como parámetro en JRE, debe editar el archivo deployment.propertiesalmacenado en la ruta c:\users\%username%\appdata\locallow\sun\java\deploymentagregando la cadena deployment.javaws.jre.1.args=-Duser.timezone\=my_time_zone

Dave
fuente
Lo intenté y no funciona (jvm ejecutado desde dentro de intellij)
kumetix