Necesito forzar cualquier operación relacionada con la hora a GMT / UTC, independientemente de la zona horaria establecida en la máquina. ¿Alguna forma conveniente de hacerlo en el código?
Para aclarar, estoy usando la hora del servidor de base de datos para todas las operaciones, pero sale formateado de acuerdo con la zona horaria local.
¡Gracias!
Respuestas:
El OP respondió a esta pregunta para cambiar la zona horaria predeterminada para una sola instancia de una JVM en ejecución, establezca la
user.timezone
propiedad del sistema:Si necesita establecer zonas horarias específicas al recuperar objetos de fecha / hora / marca de tiempo de una base de datos
ResultSet
, use la segunda forma de losgetXXX
métodos que toman unCalendar
objeto:O, estableciendo la fecha en un PreparedStatement:
Esto garantizará que el valor almacenado en la base de datos sea coherente cuando la columna de la base de datos no mantenga la información de la zona horaria.
Las clases
java.util.Date
yjava.sql.Date
almacenan el tiempo real (milisegundos) en UTC. Para formatearlos en la salida a otra zona horaria, useSimpleDateFormat
. También puede asociar una zona horaria con el valor mediante un objeto Calendario:Referencia útil
https://docs.oracle.com/javase/9/troubleshoot/time-zone-settings-jre.htm#JSTGD377
https://confluence.atlassian.com/kb/setting-the-timezone-for-the-java-environment-841187402.html
fuente
Además, si puede configurar la zona horaria de JVM de esta manera
o
-Duser.timezone=GMT
en los argumentos de JVM.fuente
System.setProperty("user.timezone" ...)
no funciona.Tuve que configurar la zona horaria de JVM para Windows 2003 Server porque siempre devolvía GMT para la nueva fecha ();
-Duser.timezone=America/Los_Angeles
O su zona horaria apropiada. Encontrar una lista de zonas horarias también resultó ser un poco desafiante ...
Aquí hay dos listas;
http://wrapper.tanukisoftware.com/doc/english/prop-timezone.html
http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzatz%2F51%2Fadmin%2Freftz.htm
fuente
Puede cambiar la zona horaria usando TimeZone.setDefault () :
fuente
para mí, simplemente SimpleDateFormat rápido,
luego formatee la fecha con una zona horaria diferente.
fuente
Recuperaría la hora de la base de datos en forma sin procesar (marca de tiempo larga o fecha de Java), y luego usaría SimpleDateFormat para formatearla, o Calendar para manipularla. En ambos casos, debe establecer la zona horaria de los objetos antes de usarlos.
Ver
SimpleDateFormat.setTimeZone(..)
yCalendar.setTimeZone(..)
para más detallesfuente
tl; dr
Evite depender del sistema operativo del host o JVM para la zona horaria predeterminada
Le recomiendo que escriba todo su código para indicar explícitamente la zona horaria deseada / esperada. No es necesario que dependa de la zona horaria predeterminada actual de la JVM. Y tenga en cuenta que la zona horaria predeterminada actual de la JVM puede cambiar en cualquier momento durante el tiempo de ejecución, con cualquier código en cualquier hilo de cualquier llamada de aplicación
TimeZone.setDefault
. Tal llamada afecta a todas las aplicaciones dentro de esa JVM inmediatamente.java.time
Algunas de las otras respuestas eran correctas, pero ahora están pasadas de moda. Las terribles clases de fecha y hora incluidas con las primeras versiones de Java tenían fallas, escritas por personas que no entendían las complejidades y sutilezas del manejo de la fecha y hora.
Las clases de fecha y hora heredadas han sido suplantadas por las clases java.time definidas en JSR 310.
Para representar una zona horaria, utilice
ZoneId
. Para representar un desplazamiento de UTC, utiliceZoneOffset
. Un desplazamiento es simplemente un número de horas-minutos-segundos por delante o por detrás del primer meridiano. Una zona horaria es mucho más. Una zona horaria es un historial de los cambios pasados, presentes y futuros del desplazamiento utilizado por la gente de una región en particular.Para una compensación de cero horas-minutos-segundos, use la constante
ZoneOffset.UTC
.Instant
Para capturar el momento actual en UTC, use un
Instant
. Esta clase representa un momento en UTC, siempre en UTC por definición.ZonedDateTime
Para ver ese mismo momento a través del tiempo de reloj de pared utilizado por la gente de una región en particular, ajústese a una zona horaria. Mismo momento, mismo punto en la línea de tiempo, diferente hora de reloj de pared.
Base de datos
Mencionas una base de datos.
Para recuperar un momento de la base de datos, su columna debe ser de un tipo de datos similar al estándar SQL
TIMESTAMP WITH TIME ZONE
. Recupere un objeto en lugar de una cadena. En JDBC 4.2 y posteriores, podemos intercambiar objetos java.time con la base de datos. ElOffsetDateTime
es requerido por JDBC, mientras queInstant
yZonedDateTime
son opcionales.En la mayoría de las bases de datos y controladores, supongo que obtendrá el momento como se ve en UTC. Pero si no es así, puede ajustarlo de dos formas:
Instant
:odt.toInstant()
Acerca de java.time
El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases de fecha y hora como
java.util.Date
,Calendar
, ySimpleDateFormat
.Para obtener más información, consulte el tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .
El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .
Puede intercambiar objetos java.time directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No se necesitan cuerdas, no se necesitan
java.sql.*
clases.¿Dónde obtener las clases java.time?
fuente
Cree un par de cliente / servidor, de modo que después de la ejecución, el servidor cliente envíe la fecha y hora correctas. Luego, el cliente pregunta al servidor pm GMT y el servidor devuelve la respuesta correcta.
fuente
Utilice la propiedad del sistema:
fuente
Ejecute esta línea en MySQL para restablecer su zona horaria:
fuente
Guau. Sé que este es un hilo antiguo, pero todo lo que puedo decir es que no llame a TimeZone.setDefault () en ningún código de nivel de usuario. Esto siempre establece la zona horaria para toda la JVM y casi siempre es una muy mala idea. Aprenda a usar la biblioteca joda.time o la nueva clase DateTime en Java 8, que es muy similar a la biblioteca joda.time.
fuente
Si desea obtener la hora GMT solo con intiger: var currentTime = new Date (); var currentYear = '2010' var currentMonth = 10; var currentDay = '30 'var currentHours = '20' var currentMinutes = '20 'var currentSeconds = '00' var currentMilliseconds = '00 '
fuente