2011-05-05 23 views
6

tengo el siguiente método para convertir la serie hasta la fecha con granularidad milisegundos¿Por qué mi comparación java time falla?

public Date convertTime(String time) { 

    SimpleDateFormat parser = new SimpleDateFormat("HH:mm:ss.S"); 
    try { 
     return parser.parse(time); 
    } 
    catch (Exception ex) { 
     ex.printStackTrace(); 
     return null; 
    } 


} 

    Date d1 = lib.convertTime("10:30:53.39"); 
    Date d2 = lib.convertTime("10:30:53.40"); 
    System.out.println(d1.after(d2)); 

retornos falsos como se esperaba

Sin embargo la siguiente

Date d1 = lib.convertTime("10:30:53.39"); 
    Date d2 = lib.convertTime("10:30:53.4"); 
    System.out.println(d1.after(d2)); 

que pensé que han sido los mismos rendimientos reales . ¿Qué estoy haciendo mal?

Respuesta

6

La confusión se debe al hecho de que el período es sólo un separador de señal de análisis, no un separador decimal numérico. Sustituya el símbolo con, por ejemplo, :, y la diferencia es más clara.

Es decir, en configuraciones regionales donde . es el separador decimal, numéricamente 1.5 = 1.50 = 1.500.

Sin embargo, cuando analizar las cadenas "1.5", "1.50", "1.500", utilizando . como separador modo, obtenemos (1, 5), (1, 50), (1, 500). El . no tiene ningún significado matemático especial aquí, y podría ser, por así decirlo, un solo espacio en blanco.

Este simple fragmento demuestra también el punto:

SimpleDateFormat parser = new SimpleDateFormat("Z s#S"); 

    System.out.println(parser.parse("GMT 1#002").getTime()); // 1002 
    System.out.println(parser.parse("GMT 1#02").getTime()); // 1002 
    System.out.println(parser.parse("GMT 1#2").getTime()); // 1002 
    System.out.println(parser.parse("GMT 1#20").getTime()); // 1020 
    System.out.println(parser.parse("GMT 1#200").getTime()); // 1200 
4

El último valor es milisegundos .. 39 es mayor que 4. 40 es mayor que 39.

Cuestiones relacionadas