2009-10-04 12 views
23

tengo 2 ordenadores diferentes, cada uno con diferente zona horaria.¿Es java.util.Date usando TimeZone?

En un equipo im impresión System.currentTimeMillis(), y luego imprime el siguiente comando en ambos equipos: System.out.println(new Date(123456)); -> 123456 equivale a la cantidad vinieron en la currentTimeMillis en el equipo # 1.

La segunda impresión (aunque se escribe con hardcoded) da como resultado diferentes impresiones, en ambas computadoras. ¿por qué es eso?

Respuesta

48

¿Qué tal un detalle pedante?

java.util.Date es independiente de la zona horaria. Lo dice muy bien en el javadoc.

¿Desea algo con respecto a una zona horaria en particular? Eso es java.util.Calendar.

¿La parte complicada? Al imprimir este material (con java.text.DateFormat o una subclass), que implica un calendario (que implica una zona horaria). Ver DateFormat.setTimeZone().

Parece seguro (no se ha comprobado la implementación) como java.util.Date.toString() pasa por un formato de fecha. Así que incluso nuestra clase (en su mayoría) independiente de la zona horaria se descompone con zonas horarias.

¿Desea obtener ese tipo de zona horaria de nuestros objetos de fecha sin zona puros? Hay Date.toGMTString(). O puede crear su propio SimpleDateFormatter y utilizar settimezone() para controlar qué zona se utiliza a sí mismo.

+0

java.util.Date es solo algo independiente de la zona horaria. Copiar y pegar desde Java SDK7 java.util.Date.toString() 'TimeZone zi = date.getZone(); if (zi! = Null) { sb.append (zi.getDisplayName (date.isDaylightTime(), zi.SHORT, Locale.US)); // zzz } else { sb.append ("GMT"); } '' date' es un 'BaseCalendar' cuya zona horaria está configurada en' TimeZone.getDefaultRef() ' –

+1

El punto clave es que estás hablando del método toString(). Dije que no había mirado la implementación de toString(), pero sospeché que se trataba de un calendario. Usted acaba de confirmar eso. No hay desacuerdo entre nosotros. –

+1

El objeto 'Fecha' funciona con un miembro' cdate' (que es un 'BaseCalendar') con un huso horario. Y luego pasan cosas que a nadie realmente le importan y 'Fecha 'se comporta como independiente de la zona horaria siempre que no lo imprima. No quise contradecir tu respuesta. –

5

Porque ese número de milisegundos es el número de milisegundos después del 1/1/1970 UTC. Si luego traduces a una zona horaria diferente, el tiempo representado será diferente.

p. Ej. 123456 puede corresponder al mediodía en Greenwich (UTC). Pero ese será un momento diferente en Nueva York.

Para confirmar esto, use SimpleDateFormat con una salida de zona horaria, y/o cambie la zona horaria en la segunda computadora para que coincida con la primera.

5

¿por qué es eso?

Debido a que algo así como el "4 oct 2009, 14:20" no tiene sentido sin conocer la zona horaria que se refiere a - que se puede ver muy probablemente en este momento, porque eso es mi tiempo, mientras escribo esto, y es probable que se diferencia por varias horas de su tiempo a pesar de que es el mismo momento en el tiempo.

Las marcas de tiempo de la computadora generalmente se miden en UTC (básicamente la zona horaria de Greenwich, Inglaterra), y la zona horaria debe tenerse en cuenta al formatearlas en algo legible para las personas.

+1

Sé que este es un tema viejo, pero tuvo que votar por su explicación/declaración de por qué la fecha sin zona horaria no tiene sentido. –

+1

@HelterScelter Tengo que rechazar la misma cosa. Es como decir que la masa no tiene sentido sin la gravedad constante. Ambos son significativos a su manera. –

2

javadoc explica esto así, System.currentTimeMillis() Tenga en cuenta que mientras que la unidad de tiempo del valor de retorno es una milésima de segundo, la granularidad del valor depende del sistema operativo subyacente y puede ser mayor. Por ejemplo, muchos sistemas operativos miden el tiempo en unidades de decenas de milisegundos.