2010-08-10 13 views
12

Estoy buscando la mejor manera de agregar milisegundos a una Fecha Java cuando milisegundos se almacenan como 'largos'. El calendario Java tiene una función add, pero solo toma un 'int' como la cantidad.Agregar milisegundos a la fecha de Java, cuando milisegundos es largo

Esta es una solución que propongo ...

Calendar now = Calendar.getInstance(); 
Calendar timeout = Calendar.getInstance(); 

timeout.setTime(token.getCreatedOn()); 
timeout.setTimeInMillis(timeout.getTimeInMillis() + token.getExpiresIn()); 

¿Alguna otra sugerencia?

Respuesta

18

Su solución se ve casi bien para mí, en realidad. Originalmente publiqué una respuesta yendo a través de Date, cuando no tomé en cuenta getTimeInMillis y setTimeInMillis correctamente.

Sin embargo, usted está llamando setTime y luego setTimeInMillis que parece algo redundante para mí. Su código es equivalente a esto:

Calendar timeout = Calendar.getInstance(); 
timeout.setTimeInMillis(token.getCreatedOn().getTime() + token.getExpiresIn()); 

Una alternativa más agradable en general, sería utilizar Joda Time aunque :) Por lo general es una API/hora mucho más agradable la fecha.

+0

Estaba usando calendar.getInstance() para algunas implementaciones, pero tuve que abandonarlo porque si la Fecha viene con TimeZones, el calendario la romperá. – will824

+0

@ will824: No entiendo nada su comentario: 'Fecha' * nunca * tiene una zona horaria asociada. Es * siempre * solo un número de milisegundos desde la época de Unix. –

+0

@Jon En realidad, debe ser como dices, pero si marcas el objeto Date, siempre lleva consigo algún tipo de zona horaria. Parece que Java ha tenido muchos problemas con la manipulación de fechas (por eso nació Joda) y esta es una de ellas. Esa es exactamente la razón por la que no pude usar los calendarios para solucionar mi problema, sino que tuve que resolver la manipulación de Joda millis.Por supuesto, mi problema era muy específico y estaba relacionado con el total de segundos transcurridos desde 1/1/1970 que debería haber sido 0 pero recibí un número negativo debido a la zona horaria. Usar calendarios disminuiría 1 hora en mi caso :( – will824

12

Puede ao crear una fecha con la fecha local actual más el número de milisegundos que necesita para añadir al caducar el tiempo

import java.util.Date; 

long expiremilis = 60000l; // 1 minute 
// Expires in one minute from now 
Date expireDate = new Date(System.currentTimeMillis() + expiremilis); 

O lo mismo con un calendario

long expiremilis = 60000l; // 1 minute 
Calendar expireDate= Calendar.getInstance(); 
// Expires on one minute from now 
expireDate.setTimeInMillis(System.currentTimeMillis() + expiremilis); 

Si utiliza un objeto Date existente que puede hacer:

import java.util.Date; 

long expiremilis = 60000l; // 1 minute 
// Expires on one minute from the date object date 
Date expireDate = new Date(myDate.getTime() + expiremilis); 

Y con un objeto de calendario existente

long expiremilis = 60000l; // 1 minute 
Calendar expireDate= Calendar.getInstance(); 
// Expires on one minute from the calendar date 
expireDate.setTimeInMillis(myCalendar.getTimeInMillis() + expiremilis); 
0

El calendario es un objeto Date bastante caro, y su funcionalidad no es la mejor. Si desea un objeto de fecha para todo uso, sugiero mirar JODA Time y tiene una función que hace lo que quiere.

Sin embargo, un objeto Java Date más simple es la clase Date como @Dubas indica.

Aún más simple para el tipo de operación que está realizando es utilizar un largo. Esto también es mucho más rápido.

long timeoutMS = token.getCreatedOn() + token.getExpiresIn(); 

Uso largo (en GMT) para todas mis fechas y solo uso Fecha para la capa de presentación. es decir. cuando quieras convertir la fecha en Texto.

Cuestiones relacionadas