11:25h.
Pues si, todavía me considero novato programando.
Hace un par de meses acabé un pequeño programa en java que entre otras cosas, guarda la duración en segundos de una llamada telefónica junto con la fecha de inicio y la fecha de fin, en una base de datos.
Cuando la llamada empieza hago:
Timestamp inicio = new Timestamp(System.currentTimeMillis());
Y cuando finaliza:
Timestamp fin = new Timestamp(System.currentTimeMillis());
int duracion = (int)(fin.getTime()-inicio.getTime())/1000;
La cosa va bien, pero el otro dia mi compañero me planteó una duda jodidilla: ¿como se comportará cuando una llamada empiece y acabe durante el cambio de hora de invierno y de verano?
Respuesta: ni p.i. No se si el currentTimeMillis se mantiene constante o de golpe va el sistema y le quita los nosecuantos mil segundos que tiene una hora..de momento voy buscando en el api de java, pero no me dice nada..
En fin, si algún lumbreras quiere iluminarme con su sabiduria, bienvenido sea.
ACTUALIZACION:
Bueno, gracias a todos vuestros comentarios. Me han sido muy útiles, aunque todavia no tengo la total certeza de que vaya a fallar, pues por un lado creo los objetos con el System.currentTimeMillis() que me pasa los segundos del epoch en UTC y para la operacion el timestamp.getTime(), que me devuelve los segundos del epoch en GMT. Y yo creo que eso es lo mismo jeje.. Solucion: el dia que vaya a petar, si peta, se arreglan los datos que esten mal y me lo vuelvo a mirar :P
Saludos!
asi a bote pronto
(Puntos:4, Informativo)( http://barrapunto.com/ | Última bitácora: Lunes, 24 Febrero de 2014, 10:03h )
lo que estas usando es la hora y fecha de la maquina, tanto como hora de inicio como hora de fin, es decir, el cambio de hora no tiene nada que ver con la API (de ahi, supongo, la dificultad de encontrar eso)
para no liar las cosas, tu programa empieza, coje la hora del sistema y se queda a la espera, cuando la llamada termina, coje la nueva hora y la resta...
ambos datos son internos al sistema y no tienes control sobre ellos, asi que si, si la llamada empieza antes de un cambio de hora y termina despues, tendras una duracion rara (con + o - 1 hora)
ahora, en cuanto a la solucion, se me ocurren varias vias, la primera es que en tu programa simple tengas en cuenta las fechas de cambio de hora
de la segunda no estoy seguro, ya que no se si tiene eso en cuenta y habria que hacer pruebas, pero podrias intentar usar el objeto Calendar (en vez del System.currentTimeMillis) y sacar las duraciones de ahi... es posible que la clase Calendar tenga en cuenta esas cosas, pero como te he dicho, no estoy seguro y habria que hacer pruebas
si funcionara asi, la segunda opcion me parece mas correcta y elegante que la primera (y que te costara menos)
Dale fuego a un hombre y estara caliente un dia, prendele fuego y estara caliente el resto de su vida.
yo creo que tiene razon
(Puntos:2)( Última bitácora: Martes, 07 Diciembre de 2010, 18:45h )
2) la funcion currenttime te da la hora actual sin mas. Si hay un cambio de hora, tendrias que contemplarlo cuando calculas la duracion.
Sugerencia:
Podrías meter una nueva tabla en base de datos donde pongas los cambios de hora que se dan en el sistema.
La tabla seria tal que asi
Hora NuevaHora
x1 y1
x2 y2
Esto significa que en el dia/hora "x1" se cambio el reloj a "y1".
La tabla esta, habria que mantenerla actualizada y te serviria no solo para los cambios de hora oficiales, sino tambien para cualquier otro cambio de hora que se haga.
Luego gracias a esta tabla, puedes saber cuando hay un cambio de hora y calcular la duracion correctamente. Es mas complicado el calculo: con este nuevo sistema la duracion la calculas a partir de la fecha de inicio, la fecha de fin de la llamada y los datos de la tabla de cambios de hora
suerte
da igual
(Puntos:1)( Última bitácora: Jueves, 23 Agosto de 2007, 11:40h )
Usa GMT
(Puntos:3, Informativo)( http://barrapunto.com/ | Última bitácora: Martes, 27 Junio de 2006, 21:11h )
Así, además, puedes seleccionar el país, etc. En este caso no es muy necesario, pero cuando se hacen cosas mínimamente complicadas con horas, sale a cuenta.
Después, claro, hay que leer bien la hora solar (ojo con el cambio de fecha) y ya lo tendrás!
Re:Asunto
(Puntos:1)( Última bitácora: Lunes, 21 Diciembre de 2009, 20:28h )
Re:Documentación
(Puntos:1)( Última bitácora: Lunes, 21 Diciembre de 2009, 20:28h )
System.currentTimeMillis() y para calcular la duracion vuelvo a obtener esos valores con timestamp.getTime(), luego no habria problema.. no?