Creo que he llegado con la peor manera de comparar dos fechas; ¿es posible hacerlo mejor?

Mi aplicación acepta una fecha que forma al usuario a través de un fragmento datepicker y lo almacena en una base de datos con el día, mes y año como columnas individuales de tipo String.

Ahora, estoy creando una función que más tarde comprobar cada una de estas fechas con la fecha actual del sistema. Si la fecha actual está por delante de la fecha introducida por el usuario (y almacenada en la base de datos) se incrementa una variable de indicador.

Aquí está el código:

public int checkDate() { //Method to check date and take action //NOT COMPLETE. STILL FIGURING IT OUT. String isstatus = "Ongoing"; String[] columns = new String[] {KEY_ROWID, DAY, MONTH, YEAR ,PROJECT_STATUS}; Cursor c = projectDatabase.query(DATABASE_TABLE, columns, PROJECT_STATUS + "=" + isstatus, null, null, null, null); int result = 0; int flag = 0; int iRow = c.getColumnIndex(KEY_ROWID); int iDay = c.getColumnIndex(DAY); int iMonth = c.getColumnIndex(MONTH); int iYear = c.getColumnIndex(YEAR); final Calendar cal = Calendar.getInstance(); //fetch current system date int cyear = cal.get(Calendar.YEAR); int cmonth = cal.get(Calendar.MONTH); int cday = cal.get(Calendar.DAY_OF_MONTH); for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) { String id = c.getString(iRow); int fday = Integer.parseInt(c.getString(iDay)); int fmonth = Integer.parseInt(c.getString(iMonth)); int fyear = Integer.parseInt(c.getString(iYear)); if(cday>fday && cmonth>fmonth && cyear>fyear) { flag++; updateStatus(id, "Missed"); } else if(cday>fday && cmonth==fmonth && cyear==fyear) { flag++; updateStatus(id, "Missed"); } else if(cday==fday && cmonth>fmonth && cyear>fyear) { flag++; updateStatus(id, "Missed"); } else if(cday==fday && cmonth==fmonth && cyear>fyear) { flag++; updateStatus(id, "Missed"); } else if(cmonth>fmonth && cyear>fyear) { flag++; updateStatus(id, "Missed"); } else if(cmonth>fmonth && cyear==fyear) { flag++; updateStatus(id, "Missed"); } result = flag; } return result; } 

Como puedes ver, tengo que comparar cada caso posible para la fecha que está por delante. Y personalmente creo que no es el método más eficiente. ¿Algún consejo?

Nunca he trabajado con fechas, pero voy a esbozar un algoritmo que al menos reduce el número de comparaciones que necesita hacer.

 if(currentYear > dataYear) { //We're obviously past that date. Move on } else if(currentYear == dataYear) { //We're in the same year. Let's check for months if(currentMonth > dataMonth) { //Missed the date again, move on } else if(currentMonth == dataMonth) { //We're in the same year and the same month! Let's check days if(currentDay > dataDay) { //Date is still in the past. Keep moving on } else if(currentDay == dataDay) { //Date is today } else { //Date is in the future } } } else { //Date is in the past } 

Esto tampoco va a ser terrible, y probablemente podría reducir el número de declaraciones if usando && estratégicamente (aunque la optimización del compilador podría hacerlo para usted de todos modos).

Un mejor enfoque sería guardar la fecha en tiempo UNIX, y obtener el tiempo UNIX actual y sólo comparar los dos largos. No se puede conseguir mucho más simple que eso.

También podría construir otro objeto de Calendar a partir de la fecha almacenada y utilizar antes () . Sin embargo, una comparación primitiva larga vs larga será más eficiente que la comparación de dos calendarios.

sugerir el uso de la biblioteca de fecha y hora joda para la comparación de la fecha, tiene algunas características útiles como isBefore y isAfter

http://joda-time.sourceforge.net/

Solo use la Date para la comparación

 Date now = new Date(); Calendar cal = Calendar.getInstance(); cal.setTime(now); // make sure the time part is the same for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) { String id = c.getString(iRow); int fday = Integer.parseInt(c.getString(iDay)); int fmonth = Integer.parseInt(c.getString(iMonth)); int fyear = Integer.parseInt(c.getString(iYear)); cal.set(Calendar.YEAR, fyear); cal.set(Calendar.MONTH, fmonth); cal.set(Calendar.DAY_OF_MONTH, fday); Date d = cal.getTime(); if (now.after(d)) { flag++; updateStatus(id, "Missed"); } result = flag; } 
  • DrawLine problema con Paint.StrokeWidth = 1 en Android
  • Automatización del emulador y navegador de Android con la secuencia de comandos de Appium
  • Tratando de rellenar ListView en Android utilizando objetos de Parse
  • Cómo consultar el valor de la columna que se establece como puntero a otra tabla en Parse
  • Usando RxJava para encadenar una serie de operaciones - ¿a dónde ir después?
  • Google Maps v2 Projection.toScreenLocation (...) muy lento
  • Android.provider.Settings.Secure.ANDROID_ID devuelve "android_id"
  • Cómo combinar mapas de bits en android?
  • Cómo nombrar getter / setter en el proyecto Android
  • AndroidStudio emulator "no se ejecutará a menos que actualice Google Play Services"
  • Android: Picasso no carga algunas imágenes
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.