2010-09-01 22 views
8

La cadena Quiero formato es el siguiente: cadena datetime = "09/01/10 11:34:35 AM"No se puede analizar DateTime-cadena con AM/PM marcador

Siguiendo el modelo establecido para las obras SimpleDateFormat :

SimpleDateFormat sdf = SimpleDateFormat("M/d/yy h:mm:ss"); 
Date d = sdf.parse(datetime); 
System.out.println(d); 

Output> [Wed Sep 01 11:34:35 CEST 2010] 

Sin embargo tengo que analizar el AM/PM marcador también, y cuando agrego que al patrón recibo una excepción.

Patrón eso no funciona:

SimpleDateFormat sdf = SimpleDateFormat("M/d/yy h:mm:ss a"); 

He tratado con esto también con la misma excepción:

SimpleDateFormat sdf = SimpleDateFormat("M/d/yy h:mm:ss aa"); 

Excepción:

java.text.ParseException: Unparseable date: "9/1/10 11:34:35 AM" 

He mirado a través de la API al http://download.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html#text pero parece que no puedo encontrar donde hago mal.

¿Alguna sugerencia?

+0

tanto "a" como "aa" funcionan para mí. ¿Cuál es tu versión de Java? – Bozho

Respuesta

25

Una posibilidad es que su Locale predeterminado tenga símbolos diferentes para AM/PM. Cuando se construye un formato de fecha siempre se debe suministrar una Locale a menos que realmente desea utilizar por defecto del sistema Locale, por ejemplo .:

SimpleDateFormat sdf = new SimpleDateFormat("M/d/yy h:mm:ss a", Locale.US) 
+1

Gracias por señalar esto. Tiene sentido y solucionó mi problema. – aksamit

+1

La lección aquí es que, al realizar trabajos de fecha y hora, ** siempre especifique la configuración regional/zona horaria deseada/esperada **. Si se omite alguno, está implícitamente confiando en el valor predeterminado actual de la JVM. Consejo de bonificación: Google "Joda-Time" y "java.time". –

+0

Sería bueno si el mensaje de excepción no fuera solo "Fecha imposible de escanear" sino también la posición en la cadena donde falló ... – golimar

0

Si está trabajando con FreeMarker para Java y el pop en esta cuestión más adelante el uso de códigos. Tuve este problema, mi configuración regional estableció AM/PM como DE. No estoy seguro de por qué ... <#setting locale="en_US">

3

Estoy tomando un ejemplo de la fecha indicada a continuación e imprimo la fecha formateada en formato de 24 horas si se ajusta a sus necesidades.

String inputdate="9/1/10 11:34:35 AM"; 
     SimpleDateFormat simpleDateFormat=new SimpleDateFormat("dd/MM/yy hh:mm:ss aa",Locale.getDefault()); 
     try { 
      System.out.println(""+new SimpleDateFormat("dd/MM/yy HH:mm:ss",Locale.getDefault()).format(simpleDateFormat.parse(inputdate))); 

     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 

Si todavía tiene alguna consulta, responda. Gracias.

0

respuesta moderna:

String datetime = "9/1/10 11:34:35 AM"; 
    LocalDateTime dt = LocalDateTime.parse(datetime, 
      DateTimeFormatter.ofPattern("M/d/yy h:mm:ss a", Locale.ENGLISH)); 

Esto produce un LocalDateTime de 2010-09-01T11: 34: 35. Sin embargo, ten cuidado con los años de dos dígitos; DateTimeFormatter asumirá de 2000 a 2099. Para mi cumpleaños, esto habría sido incorrecto.

Todavía tenemos que proporcionar la configuración regional. Como los marcadores AM/PM apenas se usan en la práctica en otros lugares que no sean en inglés, consideré Locale.ENGLISH como una apuesta bastante segura. Por favor, sustituya el suyo.

Las otras respuestas fueron buenas respuestas en 2010 y 2011. Ya en 2014 lo anterior era válido y lo hubiera preferido.

Cuestiones relacionadas