Calendario.antes (a) y el Calendario.después de() devolver valores incorrectos

Me estoy poniendo un poco atascado con fecha de comparación en Java/Android

            DateFormat df = new SimpleDateFormat("dd/MM/yy HH:mm");
                Calendar now = Calendar.getInstance();
                Calendar c;

                c = Calendar.getInstance();
                c.set(settings.getInt("year", 0), settings.getInt("month", 0), settings.getInt("day", 0), settings.getInt("hour", 0), settings.getInt("minute", 0));

                views.setTextViewText(R.id.textView4, String.valueOf(c.getTime().before(now.getTime())));
                views.setTextViewText(R.id.textView2, String.format("%s - %s", df.format(c.getTime()), df.format(now.getTime())));

                int timeout = 0;
                while( c.getTime().before(now.getTime()) )
                {
                    c.add(Calendar.SECOND, 30);
                    c.add(Calendar.MINUTE, 12);
                    c.add(Calendar.HOUR_OF_DAY, 6);
                    isHigh = 1 - isHigh;
                    timeout++;
                    if( timeout >= 400 )
                        break;
                }
                views.setTextViewText(R.id.textView5, String.valueOf(c.getTime().before(now.getTime())));
                views.setTextViewText(R.id.textView3, String.format("%s - %s", df.format(c.getTime()), df.format(now.getTime())));

La idea de esto es que se tarda una fecha de inicio de la configuración guardada, y añade 6:12:30 del reloj hasta que no pasa el tiempo actual.

Sin embargo, mis cuadros de texto que me dan el siguiente:

falso : 09/07/12 04:20 – 11/08/12 00:00

falso : 09/07/12 04:20 – 11/08/12 00:00

¿Por qué es el 9 de julio de 2012, devolviendo false cuando se llama a «antes(11 de Agosto de 2012)»?

Si puedo cambiar «.antes de» a «.después de», me sale esto:

verdadero : 09/07/12 04:20 – 11/08/12 00:00

verdadero : 20/10/12 15:40 – 11/08/12 00:00

Que no parece tener ningún sentido.

Alguna idea de lo que estoy haciendo mal? Gracias

  • Intente logCat las dos Fechas antes de compararlas y publicar el resultado.
InformationsquelleAutor Marq Watkin | 2012-08-11

3 Kommentare

  1. 6

    Me pregunto si es porque su «año» es 12 más que en 2012. Entonces estaría comparando 09/07/2012 con 11/08/0012 – pero usted no puede decir, porque de su formato de fecha.

    Para fines de diagnóstico, cambiar su formato de cadena de "dd/MM/yyyy HH:mm" e inténtelo de nuevo.

    • Sí, me muestra un año de «53312»… no sé dónde está consiguiendo que se de, pero obviamente la causa. Gracias
  2. 0

    Bien, su trabajo como se espera en el JDK con 12 así como en el 2012.

    DateFormat df = new SimpleDateFormat("dd/MM/yy HH:mm");
    Calendar now = Calendar.getInstance();
    Calendar c;
    c = Calendar.getInstance();
    c.set(12, 6, 9, 0, 0);
    System.out.println(String.valueOf(c.getTime().before(now.getTime()))); 
    System.out.println(String.format("%s - %s", df.format(c.getTime()), df.format(now.getTime())));

    De salida:-
    cierto
    09/07/12 00:00 – 11/08/12 13:29

  3. -2

    He tenido este problema antes. Pero yo no estaba obligado a comparar las horas, los minutos y los segundos. Sólo la fecha. Pero @Jon Skeet la respuesta no funcionó para mí. Así que he implementado mi propio método para comparar dos fechas. Feo, pero funciona bien.

    private boolean before(Calendar c1, Calendar c2){
            int c1Year = c1.get(Calendar.YEAR);
            int c1Month = c1.get(Calendar.MONTH);
            int c1Day = c1.get(Calendar.DAY_OF_MONTH);
    
            int c2Year = c2.get(Calendar.YEAR);
            int c2Month = c2.get(Calendar.MONTH);
            int c2Day = c2.get(Calendar.DAY_OF_MONTH);
    
            if(c1Year<c2Year){
                return true;
            }else if (c1Year>c2Year){
                return false;
            }else{
                if(c1Month>c2Month){
                    return false;
                }else if(c1Month<c2Month){
                    return true;
                }else{
                    if(c1Day<c2Day){
                        return true;
                    }else{
                        return false;
                    }
                }
            }
        }

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...