2011-09-06 20 views
6

Tengo que comparar dos fechas donde la primera fecha es en formato de calendario y otra en formato de cadena (DD-MMM-aaaa). Entonces quiero convertir una de las fechas del Calendario en Cadena y usar el método compareTo.¿Convertir la fecha del calendario en una cadena?

He intentado usar:

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

http://stackoverflow.com/questions/1653129/converting-a-calendar-date-to-a-string – 5arx

Respuesta

9

Suponiendo view.getSelectedDay() devuelve un Calendar, sólo puede desear:

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

(Así que usted tiene una referencia Date para pasar a format.)

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

1

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

1

¿Está comparando los valores para determinar si una fecha es anterior a otra o para ordenar? Si es así, es posible que se enfrente a algunos problemas de ordenamiento 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 este es -1, donde debe ser 1, como s2 como una fecha es anterior a s, pero s2 es lexicográficamente después de s cuando ordenados en orden ascendente.

Puede que le resulte más sensato convertir su fecha de cadena en un objeto Date, y luego usar before() o after().

0

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

  • Comparando Date objetos

    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); 
    
  • Comparando Calendar objetos

    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 luego comparison habrá < 0 si A < B, > 0 si A > B y == 0 si son iguales, de acuerdo con the documentation of Date o of Calendar.

La única cosa que tienes que tener cuidado con son:

  • El momento del día: debe su apuesta Calendar establecido en el mismo día de su String, pero con una hora diferente este no funcionará (estamos comparando instantes, aquí)

  • patrón la SimpleDateFormat 's: debe coincidir con el formato de su String, o usted tendrá resultados extraños

  • La configuración regional: las fechas pueden referirse al mismo instante pero ser diferentes si se expresan en diferentes zonas horarias. Si tiene que manejar eso, tendrá que encargarse del TimeZone cuando usa Calendar (consulte el documento Calendar y TimeZone para obtener más información).

+0

gracias u para toda la solución relevante – Smitha

0

Al comparar fechas como cadenas, debe usar SimpleDateFormat("yyyy-MM-dd"). Compararlos usando el formato SimpleDateFormat("dd-MM-yyyy") será incorrecto la mayor parte del tiempo debido a que se verifica primero el número menos significativo y se verifica el más significativo al final.
Si debe usar el formato dd-MM-yyyy, puede escribir una función que divida las cadenas, 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; 
} 
Cuestiones relacionadas