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.
- Firebase getDownloadURL
- Cómo pasar la identificación de correo electrónico que se sincronizarán en crear calendario de eventos en android?
- Android: obtenga dinámicamente la actividad actual en primer plano
- ¿Cómo permitir que los usuarios busquen la última versión de la aplicación desde la aplicación?
- Resolver Etiqueta de aplicación para cada tipo de compilación
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?
- Cómo reducir un archivo .jar para aligerar una aplicación de Android
- Cómo rotar Bitmap sin crear uno nuevo?
- Formato de fecha y hora según la configuración regional
- ¿Por qué las cadenas de referencia de un archivo de recursos externos en lugar de codificación en la disposición de Android XML?
- Cómo ordenar una vista de lista en orden alfabético
- El objeto AudioRecord no se inicializa en un proyecto
- Fondo Android + texto + icono para un botón
- Android: cómo crear Switch caso de esto?
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
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; }
- Respecto a la Generación Dinámica de Matemáticas y Ciencias en Textview
- cómo extender el WebView correctamente?