2010-01-28 24 views
8

[del lado del cliente de clase GWT]zonas horarias en Java/GWT (del lado del cliente)

Tengo un objeto Fecha ...

Date dataObject = DateTimeFormat.getFormat("yyyy-MM-dd'T'HH:mm:ss.SSS") 
         .parse("2009-10-12T00:00:00.000); 

Esto funciona bien. Sin embargo cuando hago una:

dateObject.getTime(); 

devuelve una milisegundos UNIX vez usando una GMT con el horario de verano, por lo tanto, lo que es un tiempo UNIX que no se puede utilizar. Lo necesito en UTC. ¿Cómo hago esto?


Actualmente estoy analizar una fecha y que me está dando la espalda:

'Thu Apr 16 08:46:20 GMT+100 2009' @ '1239867980191' 

Sin embargo la fecha en la que estoy pasando es de 1 hora menos de este tiempo (7:46 y no 8 : 46!).

¿Cómo paso en el hecho de que es UTC? O si no puede usar UTC (lo cual sería ridículo), ¿cómo uso GMT sin los ahorros de luz diurna?

+9

No hay concepto de "UNIX Tiempo (en) milisegundos usando un GMT con horario de verano". La cantidad de milisegundos transcurridos desde que se fijó la 'época' y no está relacionada con el horario GMT y/o el horario de verano. Puede estar alimentando una cadena de tiempo mal formateada y/u olvidando precisar si está usando el horario de verano o no, o está convirtiendo erróneamente su tiempo en milisegundos a otro formato. Pero la cantidad de milisegundos desde la época (utilizada tanto por Java como por Unix y por muchas otras tecnologías) es completamente independiente de GMT y del horario de verano. – SyntaxT3rr0r

+0

OldEnthusiast: esta debería ser una respuesta. –

+0

Bueno, ciertamente obtienes el premio Pedant of the day. – Federer

Respuesta

5

Su última edición hace las cosas más claras.

Básicamente, está confundido, y ya obtiene lo que quiere.

1239867980191 milisegundos desde la Época se traduce al jueves, 16 de abril de 2009, a las 7: 46: 20.191 en la zona horaria GMT. El mismo instante se traduce al mismo día, pero a 8: 46: 20.191 en la zona horaria GMT + 01. Si su cadena de entrada especificó "7: 46: 20.191" y de hecho recibió 1239867980191 de Date.getTime(), felicitaciones, el código de análisis entendió su "7: 46: 20.191" como interpretado en la zona horaria GMT, y lo hizo correctamente.

Si luego obtienes "8:46:20" al imprimir, esto es solo porque utilizas la zona horaria GMT + 01 para mostrar ese instante. Tenga en cuenta que la cadena contiene GMT+100 precisamente para notificarle que utiliza esa zona horaria para fines de visualización. El instantáneo que representa la instancia Date es, sin embargo, exactamente el instante que desea que contenga. Recuerde que una instancia Date representa un instante en el tiempo, para el cual no se aplica la noción de zona horaria: las zonas horarias se usan para convertir instantes en elementos de calendario (días, horas ...) y viceversa.

Para convertir un Date en una cadena desplegable, use DateTimeFormat.format(Date, TimeZone), que le permite especificar qué zona horaria desea usar para esa cadena.

+0

+1 para una buena aclaración y apuntando a 'DateTimeFormat.format (Date, TimeZone)' –

+0

Wow, esta ha sido una situación confusa. Parece que estás en lo correcto. Gracias por la claridad extra :) – Federer

-2

Pruebe el objeto Calendar.

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); 
Date dataObject = DateTimeFormat.getFormat("yyyy-MM-dd'T'HH:mm:ss.SSS") 
        .parse("2009-10-12T00:00:00.000); 
cal.setTime(dataObject); 
cal.getTimeInMillis(); 

De acuerdo con el API, getTimeInMillis() devuelve "el tiempo actual como milisegundos UTC de la época."

EDIT: como _bravado señaló, la API de calendario no está disponible actualmente para GWT (Issue 603). Si bien esto obtendría el tiempo apropiado en una aplicación Java, no funcionará aquí. Hay información en el group sobre el uso de GMT.

EDITAR: Falta un paréntesis de cierre en el la Calendar.getInstance() llamar

+6

No creo que puedas usar Calendar con GWT? – Federer

+0

Muy buen punto. – justkt

3

Puesto que la clase Calendar no es compatible con GWT, tal vez algo hacker como esto funcionará:

final String timezone = "GMT-07:00"; 
DateTimeFormat dtf = DateTimeFormat.getFormat("yyyy-MM-dd'T'HH:mm:ssZZZZ"); 
long unix = dtf.parse("2009-10-12T00:00:00" + timezone).getTime(); 

De esta manera puede proporcionar la información correcta de la zona horaria, sin embargo, ese debería ser el comportamiento predeterminado.

+0

Este es el tipo de cosa que estaba intentando. Sin embargo, no pude obtener una combinación correcta en absoluto. Pensé que el código de zona horaria sería "UTC" para UTC? ¿No es -7: 00 California o algo así? – Federer

+0

Agregué '" GMT-07: 00 "' como ejemplo, debe cambiar a cualquier valor que esté trabajando para usted;] (de modo que obtenga sus "milisegundos de tiempo UNIX usando un GMT con horario de verano";)) –

1

Es al revés. Una instancia Date contiene el tiempo en milisegundos desde que se haya ignorado la Época, utilizando la escala de tiempo UTC (es decir, segundos intercalares). Esto es lo que Date.getTime() devuelve y eso es lo que desea.

El culpable aquí es el analizador sintáctico, que interpreta la fecha que da como una cadena en su zona horaria local. Si quieres DateTimeFormat para interpretar la cadena como una de fecha y hora determinada en la zona horaria UTC, añada una zona horaria explícita a la cadena analizada:

DateTimeFormat.getFormat("yyyy-MM-dd'T'HH:mm:ssZZZZ") 
    .parse("2009-10-12T00:00:00.000" + " GMT"); 

(lo anterior supone que entendía la documentación GWT adecuadamente; No lo he intentado.)

Solo para que quede claro en mis anotaciones: para todos los propósitos prácticos, no hay diferencia entre "GMT" y "UTC", y no hay horario de verano en la zona horaria GMT.Otras zonas horarias a menudo se definen como "GMT más o menos algún desplazamiento" y el desplazamiento puede cambiar entre verano e invierno. Por ejemplo, la zona horaria en Nueva York es algo equivalente a "GMT-04" en verano y "GMT-05" en invierno.

+0

I piense que GMT incluye automáticamente el horario de verano, que es lo que no quiero. Quiero UTC normal o GMT normal. – Federer

+0

Corregir eso - lo hace. :( – Federer

+0

@_bravado: No es así, de ahí por qué Gran Bretaña usa BST en verano. – Powerlord

0

Sigo viendo formatos con la sugerencia de ZZZZ ... pero ¿por qué?

"aaaa-MM-dd'T'HH: mm: ss.SSSZ" se correspondería con

"2009-10-12T00: 00: 00,000 a 0000"

La última parte está el desplazamiento de UTC; California (para usar el tiempo de ejemplo de otra persona) sería -0800, -0700 en verano.

Como nota al margen, GMT también es siempre -0000. Es por eso que la zona horaria de verano de Gran Bretaña es BST (British Summer Time, +0100).

+0

Estoy pasando una indicación de fecha y hora extraída de un archivo que está en UTC. La estoy pasando. con sus sugerencias, y lo está convirtiendo a GMT Summertime, una vez más. O no está considerando GWT Client-Side o algo está fundamentalmente mal con mi GWT, que es la última versión. – Federer