2011-04-12 8 views
5

Estoy utilizando el objeto SimpleDateFormat con el objeto Date como se muestra a continuación. El problema es que el objeto Date muestra la fecha incorrecta, que está a unos minutos de la cadena original. El objeto Date parece almacenar el tiempo en milisegundos totales en el depurador.Fecha de objeto SimpleDateFormat no analiza la cadena de marca de tiempo correctamente en entorno Java (Android)

¿Alguna idea del problema?

import java.text.SimpleDateFormat; 

import java.util.Date; 

Date played_at_local; 

dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSSSSZ"); 

played_at_local = dateFormat.parse("2011-04-11T22:27:18.491726-05:00"); 

//played_at_local shows "Mon Apr 11 22:35:29 America/Chicago 2011" in debugger 

Respuesta

0

05:00 -->> 0500

y

hh --> HH // error not because of this ,but date is in 24hr format.

played_at_local = dateFormat.parse("2011-04-11T22:27:18.491726-05:00"); 

debería ser

played_at_local = dateFormat.parse("2011-04-11T22:27:18.491726-0500"); 
1

probar esto, trabajando para mí Z debe useed en la fecha, o rmove de Cadena de formato

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSSSS'Z'"); 

played_at_local = dateFormat.parse("2011-04-11T22:27:18.491726Z-05:00"); 
13

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
+2

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"; –

+0

@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

+0

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. –

0

Usted podría intentar este método: http://docs.oracle.com/javase/6/docs/api/java/sql/Timestamp.html#valueOf(java.lang.String)

La clave es que dígitos fraccionarios son opcionales y se puede utilizar un número variable de ellas. Sin embargo, esto no parece dar cuenta de la zona horaria.

A partir de los documentos:

valueOf 

public static Timestamp valueOf(String s) 
Converts a String object in JDBC timestamp escape format to a Timestamp value. 
Parameters: 
s - timestamp in format yyyy-mm-dd hh:mm:ss[.f...]. The fractional seconds may be omitted. 
Returns: 
corresponding Timestamp value 
Throws: 
IllegalArgumentException - if the given argument does not have the format yyyy-mm-dd hh:mm:ss[.f...] 
0

Prueba esto:

dTime = new SimpleDateFormat("HH:mm:ss:SS"); 
String sTime = (dTime.format(new java.util.Date())).toString(); 

Esperanza esta ayuda

+0

Por favor, añada más detalles. –

+0

Agregue alguna explicación de código. – Nilesh

Cuestiones relacionadas