2011-12-22 17 views
6

estoy recibiendo ParseException para el códigojava.text.ParseException: Fecha unparseable: aaaa-MM-DD HH: MM: ss.SSSSSS

String dateStr = "2011-12-22 10:56:24.389362"; 
    String formatStr = "yyyy-MM-dd HH:mm:ss.SSSSSS"; 
    Date testDate = null; 
    SimpleDateFormat sdf= new SimpleDateFormat(formatStr); 
    sdf.setLenient(false); 
    testDate = sdf.parse(dateStr); 

    System.out.println("CHECK DATE " + sdf.format(testDate)); 

Exception in thread "main" java.text.ParseException: Unparseable date: "2011-12-22 10:56:24.389362" at java.text.DateFormat.parse(DateFormat.java:337)

siguiente Si comento hacia fuera de la línea de sdf.setLenient(false), luego veo una diferencia horaria en la salida CHECK DATE 2011-12-22 11:02:53.000362

¿Qué estoy haciendo mal?

Respuesta

7

'S' es para milisegundo. Hay 1000 (0 a 999) milisegundos en un segundo. 389362 es mayor que 999. Los 389000 milisegundos adicionales se convierten en 389 segundos, o 6 minutos 29 segundos y se agregan a la hora.

+0

¿Cuál debería ser el patrón para permitir 389362? – Praneeth

+0

Los milisegundos son el tiempo más corto permitido. Necesita cambiar la entrada para que solo tenga tres dígitos decimales '389' en el ejemplo, y el formato finaliza en '.SSS' –

+0

Gracias. O necesito cambiar mi entrada a tres dígitos decimales o tengo que escribir mi propio analizador que permite micro segundos según @GrailsGuy – Praneeth

3

Su entrada de fecha durante milisegundos es incorrecta. Debe ser: -

String dateStr = "2011-12-22 10:56:24.389";

También no es necesario el número adicional de s de "S" en el patrón. El siguiente debería ser suficiente:

String formatStr = "yyyy-MM-dd HH:mm:ss.S";

se expresa claramente en el java docs para el tipo de presentación de Number:

Número: Para el formato, el número de letras de patrón es el mínimo número de dígitos , y los números más cortos son cero rellenos a esta cantidad. Para el análisis, se ignora el número de letras de patrón a menos que sea necesario para separar dos campos adyacentes.

Funciona cuando se establece indulgente para ser verdad (o comente la línea que por defecto es cierto) ya que está pidiendo el analizador no ser estrictos con el análisis. Desde documentos java en setLenient(): -

Especifique si el análisis de fecha/hora es indulgente o no. Con análisis indulgente, el analizador puede usar heurísticas para interpretar las entradas que no coinciden exactamente con el formato de este objeto. Con un análisis estricto, las entradas deben coincidir con el formato de este objeto.

4

El especificador de formato S hace referencia a milisegundos. Cuando permite un análisis indulgente, la última parte se interpreta como 389362 milisegundos. Cuando se agrega a la fecha hasta ahora, los últimos 3 dígitos (en realidad, el valor% 1000) se convierten en los milisegundos reales, y terminas con una fecha de aproximadamente 389 segundos (~ 6 1/2 minutos) más tarde de lo que esperas . (Con un análisis estricto, el analizador sabe que 389362 milisegundos no tiene sentido, por lo que arroja un error.)

La manera más sencilla de evitar esto, si puede garantizar que la fecha siempre será así, sería cortar los últimos 3 dígitos desactivados. (Esto le dará la mitad de las veces una fecha que está desactivada en un milisegundo. Pero eso es mejor que tener que escribir un analizador de fechas ...)

2

S solo debe usarse para milliseconds. Si quiere microsegundos, tendrá que escribir su propio analizador.

0

Uso toISOString('HH:mm:ss.S') para obtener milisegundos (3 dígitos), y luego completa como sea necesario con 0.

Por ejemplo:

new Date().toISOString('HH:mm:ss.S') 

devuelve "2012-02-10T12: 16: 39.124Z"

Cuestiones relacionadas