¿Cómo convertir la fecha del calendario en cadena?

Tengo que comparar dos fechas donde la primera fecha está en el formato del calendario y otra en el formato de la secuencia (DD-MMM-aaaa). Así que quiero convertir una de las fechas de calendario en cadena y utilizar el método compareTo.

He intentado usar:

SimpleDateFormat formatter=new SimpleDateFormat("DD-MMM-yyyy"); String currentDate=formatter.format(view.getSelectedDay()); 

Asumiendo que view.getSelectedDay() devuelve un Calendar , puede simplemente querer:

 String currentDate = formatter.format(view.getSelectedDay().getTime()); 

(Para que tenga una referencia de Date para pasar al format .)

Si ese no es el problema, por favor dé más información. Sospecho que también quiere "dd" en lugar de "DD" por cierto. "DD" es el día del año mientras que "dd" es el día del mes , según la documentación de SimpleDateFormat .

Aquí está su problema haber sido resuelto. De todos modos, ¿por qué comparar fechas a través de sus representaciones de cuerdas? ¿No sería mejor comparar objetos de la fecha como aquí ? Puede obtener el objeto Date con el método getTime () de la clase Calendar.

¿Está comparando los valores para determinar si una fecha es anterior a otra, o para ordenar? Si usted es usted puede funcionar afoul de algunas gotchas del orden de clase debido a la clasificación lexicográfica.

 String s = "12-11-2001"; String s2 = "13-11-2000"; int i = s.compareTo(s2); System.out.println(i); 

La salida de esto es -1, donde debería ser 1, como s2 como una FECHA es anterior a s, pero s2 es lexicográficamente después de s cuando se ordenan en orden ascendente.

Puede resultar más razonable convertir la fecha de la cadena en un objeto Date y, a continuación, utilizar before () o after ().

Lo mejor sería comparar objetos de Date o objetos de Calendar , creo. Muy descompuesto, da esto:

  • Comparación de objetos Date

     final Calendar calendarDate = your_date_as_a_Calendar; final String stringDate = your_date_as_a_String; final SimpleDateFormat format = new SimpleDateFormat("DD-MMM-yyyy"); final Date dateA = calendarDate.getTime(); // this gives the absolute time, that actually embeds the date! final Date dateB = format.parse(stringDate); final int comparison = dateA.compareTo(dateB); 
  • Comparación de objetos de Calendar

     final Calendar calendarA = your_date_as_a_Calendar; final String stringDate = your_date_as_a_String; final SimpleDateFormat format = new SimpleDateFormat("DD-MMM-yyyy"); final Calendar calendarB = new GregorianCalendar(); calendarB.setTime(format.parse(stringDate)); final int comparison = calendarA.compareTo(calendarB); 

Y entonces la comparison será < 0 si A < B , > 0 si A > B , y == 0 si son iguales, según la documentación de la Fecha o del Calendario .

Lo único que tienes que tener cuidado con son:

  • La hora del día: si su apuesta de Calendar establece en el mismo día que su String , pero con una hora diferente esto no funcionará (estamos comparando los instantes aquí)

  • El patrón de SimpleDateFormat : debe coincidir con el formato de tu String , o tendrás resultados extraños

  • La localidad: ¡las fechas pueden referirse al mismo instante pero ser diferentes si se expresan en diferentes zonas horarias! Si usted tiene que manejar que usted tendrá que cuidar de la zona TimeZone cuando se utiliza Calendar (ver el doc de calendario y de TimeZone para más detalles).

Al comparar fechas como cadenas debe utilizar SimpleDateFormat("yyyy-MM-dd") . Comparándolos con el SimpleDateFormat("dd-MM-yyyy") estará equivocado la mayor parte del tiempo debido al número menos significativo que está siendo verificado primero y el más significativo que está siendo comprobado por último.
Si debe usar el formato dd-MM-yyyy entonces podría escribir una función que divide las cadenas y luego compara el Año / Mes / Día en el orden correcto y devuelve positivo, negativo o cero.

 // Compares first date to second date and returns an integer // can be used in a similar manner as String.CompareTo() Public Static int CompareDates(String Date1, String Date2) { String[] splitDate1 = Date1.split("-"); String[] splitDate2 = Date2.split("-"); int ret = -1; if (splitDate1[2].CompareTo(splitDate2[2]) == 0) { if (spliDatet1[1].CompareTo(splitDate2[1]) == 0) { if (splitDate1[0].CompareTo(splitDate2[0]) == 0) { ret = 0; } else if (splitDate1[0].CompareTo(splitDate2[0]) > 0) { ret = 1; } } else if (splitDate1[1].CompareTo(splitDate2[1]) > 0) { ret = 1; } } else if (splitDate1[2].CompareTo(splitDate2[2]) > 0) { ret = 1; } Return ret; } 
  • Android: Cómo evitar que al hacer clic en una notificación llama onCreate ()
  • No se puede leer / escribir en sdcard en Android
  • Cambiar el tamaño de la fuente en la piel
  • ¿Cómo revisar el campo en android-saripaar?
  • Android: capitalize no funciona
  • Permiso de escritura de archivos de Android 6.0 denegado
  • Android cómo esperar a que termine el código antes de continuar
  • ¿Cómo agregar 7 días a la fecha actual sin pasar por los días disponibles de un mes?
  • Nuevo error Relic Android con gradle
  • implementa OnScrollListener dentro de listFragment
  • ¿Cómo iniciar el servicio en el inicio del dispositivo en android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.