2010-04-13 25 views
66

Necesito forzar cualquier operación relacionada con el tiempo a GMT/UTC, independientemente de la zona horaria configurada en la máquina. ¿Alguna forma conveniente de hacerlo en código?forzar zona horaria de Java como GMT/UTC

Para aclarar, estoy usando la hora del servidor de base de datos para todas las operaciones, pero sale formateada según la zona horaria local.

Gracias!

+0

En realidad, su problema es un subconjunto mío, pero encontré una solución. – SyBer

+0

Mire la pregunta duplicada y busque "Joda" y "DateTimeZone". –

Respuesta

90

El PO respondió a esta pregunta para cambiar la zona horaria predeterminada para una sola instancia de una JVM en ejecución, establezca la propiedad user.timezone sistema:

java -Duser.timezone=GMT ... <main-class> 

Si necesita establecer zonas horarias específicas al recuperar objetos de fecha/hora/marca de tiempo desde una base de datos ResultSet, use la segunda forma de los métodos getXXX que toma un objeto Calendar:

Calendar tzCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); 
ResultSet rs = ...; 
while (rs.next()) { 
    Date dateValue = rs.getDate("DateColumn", tzCal); 
    // Other fields and calculations 
} 

O, ajuste de la fecha en un PreparedStatement:

Calendar tzCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); 
PreparedStatement ps = conn.createPreparedStatement("update ..."); 
ps.setDate("DateColumn", dateValue, tzCal); 
// Other assignments 
ps.executeUpdate(); 

Estos se asegurará de que el valor almacenado en la base de datos es consistente cuando la columna de la base de datos no guarda información de zona horaria.

Las clases java.util.Date y java.sql.Date almacenan el tiempo real (milisegundos) en UTC. Para formatear estos en la salida a otra zona horaria, use SimpleDateFormat. También puede asociar una zona horaria con el valor de uso de un objeto Calendar:

TimeZone tz = TimeZone.getTimeZone("<local-time-zone>"); 
//... 
Date dateValue = rs.getDate("DateColumn"); 
Calendar calValue = Calendar.getInstance(tz); 
calValue.setTime(dateValue); 
+0

Una cosa a tener en cuenta acerca de la configuración de la zona horaria para toda la JVM es que afecta todo, incluso cosas como el registro. Solo algo a tener en cuenta si ese es el efecto deseado. –

+0

Sí, eso está bien. Solo un punto para mencionar, que realmente configuro el user.timezone directamente en código, en lugar de hacerlo a través del parámetro -D. – SyBer

+5

@SyBer: Eso funciona pero debe asegurarse de configurar esto antes de que cualquier método llame al método TimeZone.getDefault(). Si no, tendrá cierta confusión ya que el valor predeterminado se almacena en caché después de la primera ejecución. Esto también significa que podría ser un problema si haces esto dentro de una API/biblioteca (oculta de la vista normal) - asegúrate de documentar mucho lo que estás haciendo. –

6

Recuperé el tiempo de la base de datos en forma cruda (sello de tiempo largo o fecha de java), y luego uso SimpleDateFormat para formatearlo, o calendario para manipularlo. En ambos casos, debe establecer la zona horaria de los objetos antes de usarlo.

Ver SimpleDateFormat.setTimeZone(..) y Calendar.setTimeZone(..) para más detalles

10

que tenía que establecer la zona horaria JVM para Windows Server 2003, ya que siempre se devuelve GMT para new Date();

-Duser.timezone=America/Los_Angeles

O su zona horaria correspondiente. Encontrar una lista de zonas horarias resultó ser un poco desafiante también ...

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

3

Usted podría cambiar la zona horaria usando TimeZone.setDefault() - aunque sólo temporalmente, para algunas operaciones.

+0

Sin ofender, pero modificar temporalmente un estado estático global suena como una muy mala idea ... –

12

también si se puede establecer JVM zona horaria de esta manera

System.setProperty("user.timezone", "EST"); 

o -Duser.timezone=GMT en los argumentos de JVM.

7

para mí, simplemente SimpleDateFormat rápida,

private static final SimpleDateFormat GMT = new SimpleDateFormat("yyyy-MM-dd"); 
    private static final SimpleDateFormat SYD = new SimpleDateFormat("yyyy-MM-dd"); 
    static { 
     GMT.setTimeZone(TimeZone.getTimeZone("GMT")); 
    SYD.setTimeZone(TimeZone.getTimeZone("Australia/Sydney")); 
    } 

entonces el formato de la fecha con diferente zona horaria.

1

crear un par de cliente/servidor, de modo que después de la ejecución, el servidor del cliente envíe la hora y la fecha correctas. Luego, el cliente le pregunta al servidor pm GMT y el servidor devuelve la respuesta correcta.

-2

Si desea obtener la hora GMT solo con intiger: var currentTime = new Date(); var currentYear = '2010' var currentMonth = 10; var currentDay = '30' currentHours var = '20' currentMinutes var = '20' currentSeconds var = '00' currentMilliseconds var = '00'

currentTime.setFullYear(currentYear); 
currentTime.setMonth((currentMonth-1)); //0is January 
currentTime.setDate(currentDay); 
currentTime.setHours(currentHours); 
currentTime.setMinutes(currentMinutes); 
currentTime.setSeconds(currentSeconds); 
currentTime.setMilliseconds(currentMilliseconds); 

var currentTimezone = currentTime.getTimezoneOffset(); 
currentTimezone = (currentTimezone/60) * -1; 
var gmt =""; 
if (currentTimezone !== 0) { 
    gmt += currentTimezone > 0 ? ' +' : ' '; 
    gmt += currentTimezone; 
} 
alert(gmt) 
+2

que se parece a JavaScript (! = Java) para mí. – Phil

1

Wow. Sé que este es un hilo antiguo, pero todo lo que puedo decir es que no llames a TimeZone.setDefault() en ningún código de nivel de usuario. Esto siempre establece la zona horaria para toda la JVM y es casi siempre 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.

Cuestiones relacionadas