Necesito la diferencia entre la hora actual y la hora específica en el futuro para poder pasar el temporizador de cuenta regresiva como parámetro. Tengo función para esta operación pero calcula mal. Aquí está mi función que calcula la diferencia.
public Date RetriveLeftTime(Date incomingTime) { DateFormat milisFormat = new SimpleDateFormat("HH:mm:ss"); Date moment = Calendar.getInstance().getTime(); milisFormat.format(moment); Date configuredTime = ConfigureTime(incomingTime); milisFormat.format(configuredTime); long leftTime =configuredTime.getTime()-moment.getTime(); Date result = new Date(leftTime); result = ConfigureTime(result); Log.d("Result",result.toString()); return result; }La función ConfigureTime() para configurar los detalles de la fecha
public Date ConfigureTime(Date date){ Calendar today = Calendar.getInstance(); int date = today.get(Calendar.DATE); int year = today.get(Calendar.YEAR); int day = today.get(Calendar.DAY_OF_WEEK); int month = today.get(Calendar.MONTH); int zone = today.get(Calendar.ZONE_OFFSET); Calendar time = Calendar.getInstance(); time.setTime(date); time.set(Calendar.YEAR, year); time.set(Calendar.MONTH, month); time.set(Calendar.DAY_OF_WEEK, day); time.set(Calendar.DATE, date); time.set(Calendar.ZONE_OFFSET,zone); Log.d("ConfigureTime()",time.getTime().toString()); Log.d("Current Time",today.getTime().toString()); return time.getTime(); }Miré una publicación similar sobre este problema. Verifiqué y configuré todas mis especificaciones de tiempo, como zona horaria, fecha, año, pero sigo obteniendo un resultado incorrecto. No entiendo por qué está sucediendo. Tal vez mi código lo está haciendo de manera incorrecta. no sé ¿Qué hago mal? La mayoría de las personas recomiendan usar joda time, pero me llevé un poco demasiado lejos para cambiar joda time. ¿Hay alguna solución antes de cambiar a joda time?
Duration .between( Instant.now() , myJavaUtilDate.toInstant() ) .toMillis() Está utilizando clases terribles que fueron reemplazadas hace años por las clases java.time modernas definidas en JSR 310. Nunca use Calendar , Date , SimpleDateFormat .
Instant Si le entregaron un objeto java.util.Date , conviértalo inmediatamente en un objeto Instant . Use nuevos métodos de conversión agregados a las clases antiguas.
Instant then = myJavaUtilDate.toInstant() ; Un Instant representa un momento tal como se ve "en UTC", con un desplazamiento de cero horas-minutos-segundos.
Capture el momento actual como se ve en UTC.
Instant now = Instant.now() ;Calcular tiempo a transcurrir.
Duration d = Duration.between( now , then ) ;Verifique que su momento objetivo esté realmente en el futuro.
if( d.isNegative() ) { … deal with faulty input … } En general, es mejor pasar un objeto Duration en lugar de un mero número entero que cuenta milisegundos o nanosegundos. Pero si es necesario, puede extraer un recuento del objeto Duration .
long milliseconds = d.toMillis() ;Tenga en cuenta que, al trabajar en UTC, no necesitamos lidiar con ningún problema de zona horaria.
Si usa Android 26+, esta funcionalidad está integrada. Para versiones anteriores de Android, las herramientas más recientes brindan la mayor parte de esta funcionalidad a través de la "eliminación de azúcar de API".