Almacenamos una fecha en una tabla de SQL Server db como varchar. Cuando esto se lee en el código java como una cadena y luego se analiza para una fecha, que se lee como UTC (código de Java se encuentra en servidores que están en UT). Y en la reconversión de la fecha de ET, que va de 4 horas atrás. ¿Cómo manejo almacenar la fecha en ET en esta columna db por lo que se lee como ET en el código java.
Estamos investigando en torno a las compensaciones, pero no comprender exactamente qué hacer.
fecha varchar en la tabla 29/03/2019 23:23:03 // queremos que esta fecha sea en ET
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
Date beginDate = sdf.parse("03/29/2019 23:23:03");
// El problema es cuando este código se ejecuta, el servidor está en UTC. Así BeginDate // se lee como 29/03/2019 23:23:03 GMT 03/29/2019 23:23:03 en lugar de ET
03/29/2019 23:23:03 ET esperada real 29/03/2019 23:23:03 UTC
En primer lugar, hay que ser conscientes de que un Date
objeto no tiene una zona horaria en absoluto . Es sólo un instante en el tiempo. Así que incluso cuando se ha analizado sintácticamente el valor correctamente, va a representar el instante justo en el tiempo, pero puede que tenga que volver a convertirlo en hora del este más adelante.
En segundo lugar, es necesario tener en cuenta que el almacenamiento de valores como esta ambigüedad introduce - Si almacena un valor de (digamos) 11.03.2019 01:30 hora local, que ocurre dos veces - una vez antes del horario de verano de transición y una vez después. Si va a almacenar los tiempos siempre en el pasado, al menos debe considerar el almacenamiento UTC lugar - a pesar de que no siempre es la respuesta correcta, sobre todo si no lo está almacenando valores de fecha futura / hora .
Para la parte de análisis, sólo tiene que establecer la zona horaria en el Calendar
utilizado por SimpleDateFormat
. Por ejemplo:
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss", Locale.US);
sdf.setTimeZone(TimeZone.getTimeZone("America/New_York");
Date beginDate = sdf.parse("03/29/2019 23:23:03");
Por último, me gustaría fuertemente aconsejo empezar a migrar el código para utilizar java.time
si es posible. Es una API más agradable tanto que la java.util.Date
API etc.