Recibo una fecha y hora de un servicio web SOAP sin información de timzone. Por lo tanto, el deserializador Axis asume UTC. Sin embargo, el horario actual es en la hora de Sydney. He resuelto el problema restando el desplazamiento de zona horaria:Cambiar la zona horaria sin cambiar el tiempo en Java
Calendar trade_date = trade.getTradeDateTime();
TimeZone est_tz = TimeZone.getTimeZone("Australia/Sydney");
long millis = trade_date.getTimeInMillis() - est_tz.getRawOffset();
trade_date.setTimeZone(est_tz);
trade_date.setTimeInMillis(millis);
Sin embargo, no estoy seguro de si esta solución también toma en cuenta el horario de verano. Creo que debería, porque todas las operaciones están en horario UTC. ¿Alguna experiencia con manipular el tiempo en Java? Mejores ideas sobre cómo resolver este problema?
Siempre, siempre, y solo manipule la fecha (en cualquier idioma) usando la única unidad que está arreglada. Esa unidad es la segunda (o milisegundo). Hay minutos con 59 o 61 segundos y hay días con 23 o 25 horas. Hay horas con 60 * 60 +/- 1 segundos, etc. Todas mis fechas se almacenan como (milli) segundos desde la época. Así es como están en la base de datos, así es como están ordenados. El único momento en el que hago una zona horaria/aaaa-mm-dd sea cual sea la conversión es cuando se debe mostrar al usuario (o cuando se utilizan API rotas que no entienden que una fecha se puede expresar en segundos). – SyntaxT3rr0r
@WizardOfOdds. Ese es el consejo sensato, pero OP publicó claramente que recibe la marca de tiempo de un servicio web (posiblemente de terceros) y utilizó una biblioteca de terceros para procesar esa solicitud. Claramente hay algunas cosas fuera de su control directo, y la conversión de la zona horaria a la zona horaria definitivamente no es directa con java.util.Calendar. –
Gracias por sus comentarios. Estoy generando los apéndices del servicio web del archivo WSDL utilizando Axis. Estoy usando las clases generadas para conectarme a un servicio web de terceros. De hecho, creo que deberían transmitir campos de fecha y hora con información de zona horaria o en UTC, que es lo que espera Axis. Pero esa no es mi elección. –