2012-06-25 21 views
5

Estoy teniendo un pequeño problema con una conversión de tiempo entre un teléfono Android (Nexus one) y un servidor de Java. Todo lo que he leído dice que son iguales, pero cuando estoy convirtiendo un sello de tiempo largo, parece que pierdo 1 hora (exactamente).Android Time vs Java Time

En concreto, si corro el código siguiente en el dispositivo androide Me da la siguiente salida

Código:

Calendar g = Calendar.getInstance(); 
g.setTimeInMillis(1340661899000L); 
Log.d(TAG, g.getTime().toLocaleString()); 

de salida: 25 de Jun, 2012 6:04:59 PM

Lo cual creo que es correcto, pero cuando ejecuto exactamente el mismo código en un servidor de Java obtengo el mismo día pero 1 hora antes

Código:

Calendar g = Calendar.getInstance(); 
g.setTimeInMillis(1340661899000L); 
System.out.println(g.getTime().toLocaleString()); 

Salida: 25-Jun-2012 05:04:59 PM

¿Alguien sabe qué podría estar causando esto? Tanto el servidor como el teléfono están ubicados en el mismo lugar (lo que no debería importar) y los relojes tanto en el servidor como en el teléfono coinciden

+1

Probablemente no desee utilizar el tiempo localizado en la comunicación entre el cliente y el servidor, ya que no puede estar seguro de cuál será la configuración regional de tiempo en el cliente. –

+0

el valor 1340661899000L no debería ser una hora local, solo quiero mostrar qué hora sería en el dispositivo timezone –

+2

Esperar que el cliente y el servidor estén en la misma zona horaria/modo es lo que sugerí que evite. –

Respuesta

4

Teniendo en cuenta que es una diferencia de una hora, ¿podría tener DST (Daylight? Tiempo de ahorro) configurado en el servidor y no en el teléfono o viceversa.

+0

bueno, ahora solo me siento como un idiota. Ya, por alguna razón, la versión del teléfono de toLocaleString no estaba teniendo en cuenta el horario de verano, aunque el reloj del teléfono era la hora correcta. –

+0

@JohnS Este es un ejemplo de por qué debe evitar trabajar en valores de fecha y hora locales. Mantenga sus comunicaciones de datos, lógica comercial, almacenamiento de datos y reloj del servidor en [UTC] (http://en.m.wikipedia.org/wiki/Coordinated_Universal_Time) (con algunas excepciones). Convierta a la zona horaria local ajustada solo cuando lo espere el usuario o consumidor de sus datos. –

1

Lo que Chris intenta decir es que su teléfono y servidor pueden configurarse en diferentes zonas horarias.

Intente imprimir el resultado de cal.getTimeZone(). Si este es el problema, querrá elegir una zona horaria para usar en las comunicaciones. Por ejemplo:

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+0")); 

De acuerdo con los JavaDocs los casos calendario utilicen los husos horarios predeterminados reportados por:

TimeZone.getDefault() 

A pesar de su servidor y móvil que se establece en la misma zona horaria no necesariamente significa que utilizan el mismo TimeZone predeterminado.