2008-08-08 23 views
26

Estoy ejecutando una aplicación Tomcat, y necesito mostrar algunos valores de tiempo. Desafortunadamente, llega el momento de una hora de descanso. La miré a ella y descubrí que mi zona horaria por defecto se establece en:Java Time Zone está en mal estado

sun.util.calendar.ZoneInfo[id="GMT-08:00", 
          offset=-28800000, 
          dstSavings=0, 
          useDaylight=false, 
          transitions=0, 
          lastRule=null] 

En lugar de la zona horaria del Pacífico. Esto también se indica cuando intento imprimir el huso horario predeterminado display name, y aparece "GMT-08: 00", lo que parece indicarme que no está configurado correctamente en la zona horaria del Pacífico de los EE. UU. Me estoy ejecutando en Ubuntu Hardy Heron, actualizado de Gutsy Gibbon.

¿Existe algún archivo de configuración que pueda actualizar para decirle al JRE que use Pacific con toda la información asociada al horario de verano? La hora en mi máquina se muestra correctamente, por lo que no parece ser una configuración incorrecta en todo el sistema operativo.


Ok, aquí está una actualización. Un compañero de trabajo sugirió que actualice JAVA_OPTS en mi/etc/profile para incluir "-Duser.timezone = US/Pacific", que funcionó (también vi CATALINA_OPTS, que también actualicé). En realidad, acabo de exportar el cambio a las variables en lugar de usar el nuevo/etc/profile (un reinicio posterior recogerá los cambios y seré dorado).

Sin embargo, sigo pensando que hay una mejor solución ... debería haber una configuración para Java en alguna parte que diga qué zona horaria está usando, o cómo está agarrando la zona horaria. Si alguien conoce este tipo de configuración, sería increíble, pero por ahora esta es una solución decente.


estoy usando 1.5, y es sin duda un problema el horario de verano. Como puede ver, la zona horaria está configurada para no usar el horario de verano. Mi creencia es que se establece genéricamente en -8 desplazamiento en lugar de la zona horaria específica del Pacífico. Dado que el desplazamiento genérico -8 no tiene información de ahorro de luz diurna, por supuesto no lo está usando, pero la pregunta es, ¿dónde le digo a Java que use la zona horaria del Pacífico cuando se inicie? NO estoy buscando una solución programática, debería ser una solución de configuración.

Respuesta

20

Es una "peculiaridad" en la forma en que la JVM busca el archivo zoneinfo. Ver Bug ID 6456628.

La solución más fácil es hacer/etc/localtime un enlace simbólico al archivo de zona correcto. Para la hora del Pacífico, los siguientes comandos deben trabajar:

# sudo cp /etc/localtime /etc/localtime.dist 
# sudo ln -fs /usr/share/zoneinfo/America/Los_Angeles /etc/localtime 

no he tenido ningún problema con el enfoque de enlace simbólico.

Editar: Se agregó "sudo" a los comandos.

+0

+1: Acabo de toparme con esto en un servidor Ubuntu 9.10 completamente actualizado. Sun JDK 1.6.0_15-b03, el sistema está configurado en el momento de la instalación para la zona horaria de EE. UU./Este./etc/localtime contiene los contenidos idénticos de/usr/share/zoneinfo/US/Eastern. Java produce resultados incorrectos para las fechas entre el 15 de marzo de 2010 y el 25 de abril. Después de reemplazar el archivo con un enlace simbólico a/usr/share/zoneinfo/US/Eastern, ahora obtengo los resultados correctos. Estoy sorprendido de que este error a) aún abierto, b) afecte a un servidor Ubuntu completamente actualizado (9.10 - Karmic). –

+0

El error se observó como cerrado en Java versión 7 (b72). – Raedwald

+0

Cambiar/etc/localtime a un enlace simbólico; es posible que esperes romper cosas en sistemas Linux más modernos (por ejemplo, cuando los paquetes se actualizan o posiblemente al inicio). Sospecho que la razón para cambiar de un enlace simbólico a una copia de un archivo tendría que ver con la secuencia de inicio y las dependencias (particularmente si/usr/está en un sistema de archivos diferente). Me resulta más útil establecer la variable de entorno TZ –

0

Puede ser útil volver a verificar las reglas de zona horaria que usa su sistema operativo.

/usr/bin/zdump -v /etc/localtime | less 

Este archivo debe contener las reglas de horario de verano, como éste para el año 2080:

/etc/localtime Sun Mar 31 01:00:00 2080 UTC = Sun Mar 31 02:00:00 2080 BST isdst=1 gmtoff=3600 

Puede comparar esto con las reglas de zona horaria que usted piensa que usted debe utilizar. Se pueden encontrar en /usr/share/zoneinfo/.

1

Tuve un problema similar, posiblemente el mismo. Sin embargo, mi servidor tomcat se ejecuta en un cuadro de Windows para que la solución de enlace simbólico no funcione.

Configuré -Duser.timezone=Australia/Sydney en el JAVA_OPTS sin embargo, tomcat no reconoció que DST estaba en efecto. Como solución, cambié Australia/Sydney (GMT + 10: 00) a Pacific/Numea (GMT + 11: 00) para que los tiempos se mostraran correctamente. Sin embargo, me encantaría saber la solución real o el error, si corresponde.

22

En Ubuntu, no es suficiente cambiar el archivo/etc/localtime. Parece leer el archivo/etc/timezone, también. Es mejor seguir el instruction para establecer correctamente la zona horaria. En particular, haga lo siguiente:

$ sudo cp /etc/timezone /etc/timezone.dist 
$ echo "Australia/Adelaide" | sudo tee /etc/timezone 
Australia/Adelaide 
$ sudo dpkg-reconfigure --frontend noninteractive tzdata 

Current default time zone: 'Australia/Adelaide' 
Local time is now:  Sat May 8 21:19:24 CST 2010. 
Universal Time is now: Sat May 8 11:49:24 UTC 2010. 

En mi Ubuntu, si/etc/localtime y/etc/zona horaria son incompatibles, Java parece leer zona horaria predeterminada de/etc/zona horaria.

+0

Funciona como un encanto en Ubuntu 10.0.4 LTS. Algo más agradable también. Simplemente ejecuté sudo dpkg-reconfigure tzdata y podría seleccionar la zona horaria correcta en la interfaz. – msung

+0

dpkg-reconfigure tzdata era exactamente lo que estaba buscando. ¡Gracias! –

+0

Acabo de toparme con este problema en lubuntu 16.04 (gnome). Esta solución funcionó a las mil maravillas. – 7yl4r