intente eliminar el fracciones de segundo de la cadena de formato. Me encontré con el mismo problema, pero con un formato ligeramente diferente. Mi formato de entrada no estaba en formato ISO (sin "T" ni con "Z"), pero el síntoma era el mismo: el tiempo estaba desactivado por una cantidad aleatoria de minutos y segundos, pero todo lo demás estaba bien. Esto es lo que mis resultados del registro parecían:
Cuando se utiliza el segundo formato fraccional:
SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS");
# Parsed date: 2011-05-27 17:11:15.271816 => Fri May 27 17:15:46 EDT 2011
# Parsed date: 2011-05-27 17:09:37.750343 => Fri May 27 17:22:07 EDT 2011
# Parsed date: 2011-05-27 17:05:55.182921 => Fri May 27 17:08:57 EDT 2011
# Parsed date: 2011-05-27 16:55:05.69092 => Fri May 27 16:56:14 EDT 2011
# Parsed date: 2011-05-27 16:38:35.50348 => Fri May 27 16:39:25 EDT 2011
me fijo mediante la eliminación de las fracciones de segundo a partir del formato.
SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
# Parsed date: 2011-05-27 17:11:15.271816 => Fri May 27 17:11:15 EDT 2011
# Parsed date: 2011-05-27 17:09:37.750343 => Fri May 27 17:09:37 EDT 2011
# Parsed date: 2011-05-27 17:05:55.182921 => Fri May 27 17:05:55 EDT 2011
# Parsed date: 2011-05-27 16:55:05.69092 => Fri May 27 16:55:05 EDT 2011
# Parsed date: 2011-05-27 16:38:35.50348 => Fri May 27 16:38:35 EDT 2011
Lo que creo que está sucediendo es que mi parte "fracciones de segundo" de la cadena de entrada es demasiado largo (lo mismo es cierto en el ejemplo OP). Parece estar esperando solo tres lugares decimales. Si se hacen las cuentas (tomar el primer ejemplo):
- fracciones de segundo = 0.271816 segundos
- Lo que ve es DateFormat
271816/1000
de un segundo
- 271816/1000 == 271 segundos
- 271/60 = 4 minutos
- 271% 60 = 31 segundos
- 17:11:15-17:15:46 es exactamente 4 minutos, 31 segundos fuera
Sí, SimpleDateFormat no puede manejar microsegundos. Lo más fácil es quitar los 3 dígitos adicionales, p. date = date.substring (0, date.length() - 4) + "Z"; –
@scottw: excepto que no siempre funcionará, como puede ver en mi ejemplo, los últimos 2 elementos tienen solo 5 dígitos, en lugar de 6; entonces, en algunos casos, podría haber solo 1 lugar decimal, ¡lo que sería completamente incorrecto! Si simplemente trunca la cadena para tener solo 3 decimales, entonces también funciona bien. En nuestro caso, no necesitábamos los microsegundos (supongo que muchas personas también estarían de acuerdo con eso), así que resulta que quitar el 'S' de la cadena de formato es suficiente para obtener un tiempo utilizable. Si necesitas los segundos fraccionarios, entonces sí, tienes que hacer algo de manipulación de cuerdas. – Joe
ese es un buen punto Joe - mi solución solo funcionó ya que estaba trabajando desde un servicio que siempre proporcionaba 6 dígitos por fracciones de segundo (incluido el relleno con ceros) para que pudiera salirse con la suya con la manipulación de cadenas. –