Ayuda con GMT / UTC ?

Saludos a todos los miembros de java méxico, me encuentro aquí tratando de saber del manejo de zonas horarias.
Investigando un poco sobre las zonas horarias me di cuenta que las fechas en java no se utilizan con GMT (como yo me lo imaginaba), si no que se utilizan con UTC

Traté de investigar eso del UTC pero sigo sin entenderle, sólo sé que es más exacto que GMT y que toma como base una fecha, pero hasta ahí....

Mi duda es,,, yo tengo una aplicación en donde un usuario en tijuana va a hacer una operación y va a quedar guardada la fecha de su ordenador en milisegundos en la bd de mi sistema, entonces yo quiero tomar esa fecha y convertirla a mi zona horaria (mexico df)

No entiendo cómo un date (time=long) que crean en tijuana pueda ser convertido hacia la zona horaria del df sin decirle que viene de tijuana
Tengo el siguiente código:

        // Supongamos que este yo lo creo en tijuana
        Calendar local = new GregorianCalendar();
        local.set(Calendar.HOUR_OF_DAY, 18);
        local.set(Calendar.MINUTE, 0);
        local.set(Calendar.SECOND, 0);

        Calendar c = new GregorianCalendar(TimeZone.getTimeZone("America/Tijuana"));
        c.setTime(local.getTime());
        System.out.println("tijuana:" + c.get(Calendar.HOUR_OF_DAY));

        // df
        c = new GregorianCalendar(TimeZone.getTimeZone("America/Mexico_City"));
        c.setTime(local.getTime());
        System.out.println("mexico:" + c.get(Calendar.HOUR_OF_DAY));

        // japon
        c = new GregorianCalendar(TimeZone.getTimeZone("Japan"));
        c.setTime(local.getTime());
        System.out.println("japon:" + c.get(Calendar.HOUR_OF_DAY));

De antemano muchas gracias ..

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

Documentación

En términos prácticos, UTC y GMT es lo mismo. Al menos, se refieren a la misma hora. La diferencia es que GMT se basa en observaciones astronómicas mientras que UTC se basa en un reloj atómico.

La documentación de java.util.Date, de la JVM en cuanto a fechas y de java.util.Calendar tiene la información que necesitas. Pero no te quedes con la curiosidad; haz una prueba. Configura dos computadoras, una con la zona del DF y una con la zona de Tijuana (o de Japón o donde quieras) y corre simultáneamente un programa que te imprima primero un java.util.Date().toString(), luego un System.currentTimeMillis() (o invoca getTime() en el java.util.Date que ya creaste) y finalmente creas un GregorianCalendar() al que le pides su zona horaria.

La impresión del Date te va a dar horas distintas y zonas distintas (pero mismo minuto, etc). El System.currentTimeMillis() debe darte un valor muy cercano (menos de 200mil que son poco más de 3 minutos, suponiendo que la hora no la tengan muy bien sincronizada). Eso significa que el valor interno que guarda un java.util.Date está siempre en UTC, no varía según la zona horaria; dos instancias de java.util.Date() creadas al mismo tiempo en dos lugares distintos de la Tierra deben tener el mismo valor cuando les pides getTime() (el valor en milisegundos transcurridos desde el 1 de enero de 1970 a las 0 horas en UTC). Por lo tanto un java.util.Date puede ser creado en Tijuana y transmitido al DF y no hay ningún problema, en el DF se presentará con la zona de Tijuana, o si lo conviertes a la zona local, pues con la zona local. Para cambiarle la zona horaria a un java.util.Date debes pasarlo por un Calendar (GregorianCalendar concretamente).

Si ese java.util.Date generado en un lugar lo vas a guardar en la base de datos para leerlo en otro lugar distinto desde esa misma base de datos, asegúrate que el tipo de dato que usas en la base de datos sea independiente también de la zona horaria (por ejemplo un "timestamp without timezone" en PostgreSQL).

Magistral explicación,

Magistral explicación, muchas gracias voy a hacer pruebas ----

Crees que sea conveniente guardar en mi bd un long con la fecha en milisegundos ? De esta forma reconstruyo mi Date y me quito de broncas de estar guardando el date y tener broncas con la zona horaria

Imagen de ezamudio

JDBC

Deja que la base de datos haga su trabajo. Si guardas en la base de datos un long entonces si quieres hacer búsquedas por rangos de fecha desde otra cosa que no sea Java, vas a tener que estar haciendo conversiones. Incluso para hacer búsquedas por rangos de fechas en Java tendrás que estar convirtiendo esas fechas a números para la búsqueda.

Internamente, cualquier base de datos decente te guarda una fecha como un número, pero puede que la referencia sea 2010-01-01 en vez de 1970-01-01; deja que el driver de JDBC de tu base de datos haga su trabajo de convertir entre el tipo de fecha/hora de tu base de datos y un java.util.Date o java.sql.Timestamp. Como dije anteriormente, java.util.Date no tiene zona horaria, de modo que no sé de qué broncas hablas.

Si necesitas manejar fechas y horas de manera más compleja, revisa JodaTime.

Locale

Ok, así lo hare gracias por el consejo

oye el locale es algo independiente a todo esto verdad ? Creo que el locale sólo sirve para formatear números, fechas (pero no hace converción entre regiones, sólo la posición de los números), etc

Gracias

Imagen de ezamudio

Locale

Así es, el Locale es para la internacionalización de mensajes, formatos de números y fechas, etc. Con fechas lo que necesitas manejar en TimeZone.

Fixed

Gracias por tu tiempo ezamudio

sincronización de fecha-hora

Hola ! tengo un problema similar a este , les comento , suponiendo que tengo dos computadoras; la computadora 1 con una hora de 10:10:50 y la computadora 2 con una hora de 16:20:90, suponiendo que las dos maquinas están configuradas con la misma zona horaria, al obtener los mili segundos puedo ver que no son iguales, ¿Cómo puedo obtener la hora "mundial" y setearla en las fechas ? ¿Se puede?

Agradecería mucho si pudieran decirme que camino seguir ...

He intentado cosas como cambiar el formato a UTC pero no funciona por que Date toma la fecha del sistema y yo lo que quiero es obtener o calcular la fecha y hora "mundial" y tomarla como referencia

De antemano gracias.

Imagen de ezamudio

java?

Esto qué tiene que ver con Java? Son dos equipos que no tienen la misma hora. Si los quieres sincronizar de manera muy exacta, utiliza NTP, pero eso es algo a nivel sistema operativo, no aplicaciones de Java.

Lo siento , no me di a

Lo siento , no me di a explicar del todo.

tengo una aplicación web que genera un token formado de un id + System.currentTimeMillis()

tengo una aplicación en un dispositivo móvil que también genera un token formado de un id + System.currentTimeMillis()

al momento de querer compararlas pueden o no pueden coincidir debido a que las horas donde corren las aplicaciones no son iguales.

Perdón si no me doy a explicar del todo .

Lo que he intentado es :
conectarme a un servidor de hora y luego setearlo a un Date , el único PERO es que el dispositivo móvil NO tendrá internet, solo la primera vez que se instale la aplicación .Lo que se me ocurre es crear un Reloj interno dentro de la aplicación . Soy muy inexperta en esto .

---

---

Imagen de ezamudio

mala idea

Sin sincronización externa, va a ser muy difícil que dos dispositivos coincidan a nivel milisegundos (por no decir imposible). Incluso si el móvil se conecta de vez en cuando al server para obtener la hora y sincronizarse, con tantita latencia en la red ya no quedaron sincronizados.

Si el dispositivo móvil es un celular, los carriers por lo general permiten sincronizar la hora del dispositivo y eso no es con conexión de datos, es via la conexión celular (algún otro protocolo que solamente se sincroniza via la radiofrecuencia, no tiene costo adicional). Y por lo general no están tan desviados de un servidor NTP, pero aún así no va a estar en el mismo milisegundo que un server. Deberías esperar siempre tener una desviación de algunos segundos.

Los tokens bancarios por ejemplo, permiten una desviación de varios segundos o hasta minutos, porque el dispositivo funciona completamente offline, solamente es sincronizado una vez y ya.

Ok . De hecho lo que trato de

Ok . De hecho lo que trato de simular es un token bancario , pero este se basaría en el algoritmo TOTP, que genera el token en base al tiempo.

Entonces lo que me comentas es que debo dar por hecho que la hora del celular siempre va estar bien configurada ?

Y si, los milisegundos pueden tener un rango de diferencia .

Ya no se por donde investigar , ya investigue google authenticator, authy y nada . Podrías aconsejarme algo