La mejor forma de comparar fechas en Android

Estoy tratando de comparar una fecha en un formato de Cadena con la fecha actual. Así es como lo hice (no lo he probado, pero debería funcionar), pero estoy usando métodos obsoletos. ¿Alguna buena sugerencia para una alternativa? Gracias.

PD Realmente odio hacer cosas de Date en Java. Hay tantas maneras de hacer lo mismo, que realmente no está seguro de cuál es la correcta, de ahí mi pregunta aquí.

String valid_until = "1/1/1990"; Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy"); Date strDate = sdf.parse(valid_until); int year = strDate.getYear(); // this is deprecated int month = strDate.getMonth() // this is deprecated int day = strDate.getDay(); // this is deprecated Calendar validDate = Calendar.getInstance(); validDate.set(year, month, day); Calendar currentDate = Calendar.getInstance(); if (currentDate.after(validDate)) { catalog_outdated = 1; } 

Su código podría reducirse a

 SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); Date strDate = sdf.parse(valid_until); if (new Date().after(strDate)) { catalog_outdated = 1; } 

o

 SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); Date strDate = sdf.parse(valid_until); if (System.currentTimeMillis() > strDate.getTime()) { catalog_outdated = 1; } 

Puede crear directamente un Calendar partir de una Date :

 Calendar validDate = new GregorianCalendar(); validDate.setTime(strDate); if (Calendar.getInstance().after(validDate)) { catalog_outdated = 1; } 

Puedes usar compareTo ()

El método CompareTo debe devolver un número negativo si el objeto actual es menor que otro objeto, un número positivo si el objeto actual es mayor que otro objeto y cero si ambos objetos son iguales entre sí.

 // Get Current Date Time Calendar c = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm aa"); String getCurrentDateTime = sdf.format(c.getTime()); String getMyTime="05/19/2016 09:45 PM "; Log.d("getCurrentDateTime",getCurrentDateTime); // getCurrentDateTime: 05/23/2016 18:49 PM if (getCurrentDateTime.compareTo(getMyTime) < 0) { } else { Log.d("Return","getMyTime older than getCurrentDateTime "); } 

Tenga en cuenta que el formato correcto es (“dd / MM / aaaa”) antes de que el código funcione. “mm” significa minutos!

 String valid_until = "01/07/2013"; SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); Date strDate = null; try { strDate = sdf.parse(valid_until); } catch (ParseException e) { e.printStackTrace(); } if (new Date().after(strDate)) { catalog_outdated = 1; } 
 Calendar toDayCalendar =Calendar.getInstance(); Date date1=toDayCalendar.getTime(); Calendar tomorrowCalendar =Calendar.getInstance(); tomorrowCalendar.add(Calendar.DAY_OF_MONTH,1); Date date2=tomorrowCalendar.getTime(); //date1 is a present date and date2 is tomorrow date if(date1.compareTo(date2)<0){ //0 comes when two date are same, //1 comes when date1 is higher then date2 //-1 comes when date1 is lower then date2 } 
 String date = "03/26/2012 11:00:00"; String dateafter = "03/26/2012 11:59:00"; SimpleDateFormat dateFormat = new SimpleDateFormat( "MM/dd/yyyy hh:mm:ss"); Date convertedDate = new Date(); Date convertedDate2 = new Date(); try { convertedDate = dateFormat.parse(date); convertedDate2 = dateFormat.parse(dateafter); if (convertedDate2.after(convertedDate)) { txtView.setText("true"); } else { txtView.setText("false"); } } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

vuelve verdadero … y también puedes verificar antes e igual con ayuda de date.before y date.equal …

 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd",Locale.getDefault()); Calendar calendar1 = Calendar.getInstance(); Calendar calendar2 = Calendar.getInstance(); Date date1 = dateFormat.parse("2013-01-01"); Date date2 = dateFormat.parse("2013-01-02"); calendar1.setTime(date1); calendar2.setTime(date2); System.out.println("Compare Result : " + calendar2.compareTo(calendar1)); System.out.println("Compare Result : " + calendar1.compareTo(calendar2)); 

Compara el tiempo representado por este Calendario con el representado por el Calendario dado.

Devuelve 0 si las horas de los dos calendarios son iguales, -1 si la hora de este calendario es anterior a la otra, 1 si la hora de este calendario está después de la otra.

Podrías probar esto

 Calendar today = Calendar.getInstance (); today.add(Calendar.DAY_OF_YEAR, 0); today.set(Calendar.HOUR_OF_DAY, hrs); today.set(Calendar.MINUTE, mins ); today.set(Calendar.SECOND, 0); 

y podría usar today.getTime() para recuperar el valor y comparar.

convierta la fecha en Calendario y haga sus cálculos allí. 🙂

 Calendar cal = Calendar.getInstance(); cal.setTime(date); int year = cal.get(Calendar.YEAR); int month = cal.geT(Calendar.MONTH); int day = cal.get(Calendar.DAY_OF_MONTH); //same as cal.get(Calendar.DATE) 

O:

 SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy"); Date strDate = sdf.parse(valid_until); if (strDate.after(new Date()) { catalog_outdated = 1; } 

A veces necesitamos hacer una lista con fechas, como

hoy con hora

ayer con ayer

otros días con 23/06/2017

Para hacer esto, necesitamos comparar la hora actual con nuestros datos.

 Public class DateUtil { Public static int getDateDayOfMonth (Date date) { Calendar calendar = Calendar.getInstance (); Calendar.setTime (date); Return calendar.get (Calendar.DAY_OF_MONTH); } Public static int getCurrentDayOfMonth () { Calendar calendar = Calendar.getInstance (); Return calendar.get (Calendar.DAY_OF_MONTH); } Public static String convertMillisSecondsToHourString (long millisSecond) { Date date = new Date (millisSecond); Format formatter = new SimpleDateFormat ("HH: mm"); Return formatter.format (date); } Public static String convertMillisSecondsToDateString (long millisSecond) { Date date = new Date (millisSecond); Format formatter = new SimpleDateFormat ("dd / MM / yyyy"); Return formatter.format (date); } Public static long convertToMillisSecond (Date date) { Return date.getTime (); } Public static String compare (String stringData, String yesterday) { String result = ""; SimpleDateFormat simpleDateFormat = new SimpleDateFormat ("yyyy-MM-dd HH: mm: ss"); Date date = null; Try { Date = simpleDateFormat.parse (stringData); } Catch (ParseException e) { E.printStackTrace (); } Long millisSecond = convertToMillisSecond (date); Long currencyMillisSecond = System.currentTimeMillis (); If (currencyMillisSecond> millisSecond) { Long diff = currencyMillisSecond - millisSecond; Long day = 86400000L; If (diff  

También puedes verificar este ejemplo en GitHub y esta publicación .

Puede usar validDate.setTime (strDate) Eche un vistazo a javadoc en http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Calendar.html

Joda-Time

Las clases java.util.Date y .Calendar son notoriamente problemáticas. Evítales. Use Joda-Time o el nuevo paquete java.time en Java 8.

LocalDate

Si desea solo la fecha sin hora del día, utilice la clase LocalDate.

Zona horaria

Obtener la fecha actual depende de la zona horaria. Una nueva fecha llega a París antes de Montreal. Especifique la zona horaria deseada en lugar de depender de la configuración predeterminada de la JVM.

Ejemplo en Joda-Time 2.3.

 DateTimeFormat formatter = DateTimeFormat.forPattern( "d/M/yyyy" ); LocalDate localDate = formatter.parseLocalDate( "1/1/1990" ); boolean outdated = LocalDate.now( DateTimeZone.UTC ).isAfter( localDate );