Não é possível analisar a string DateTime com o marcador AM / PM

A string que eu quero formatar tem esta aparência: String datetime = “9/1/10 11:34:35 AM”

O padrão a seguir para SimpleDateFormat funciona:

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] 

No entanto, preciso analisar também o marcador AM / PM e, quando adiciono isso ao padrão, recebo uma exceção.

Padrão que não funciona

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

Eu tentei com isso também com a mesma exceção:

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

Exceção:

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

Eu olhei através da API em http://download.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html#text, mas canät parece encontrar onde estou errado.

Alguma sugestão?

Uma possibilidade é que seu Locale padrão tenha símbolos diferentes para AM / PM. Ao construir um formato de data, você deve sempre fornecer um Locale menos que você realmente queira usar o Locale padrão do sistema, por exemplo:

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

Estou tomando um exemplo de data abaixo e imprimo a data formatada no formato de 24 horas se for adequado às suas necessidades.

  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(); } 

Se você ainda tiver alguma dúvida, responda. Obrigado.

Se você está trabalhando com o FreeMarker para Java e pop nesta questão, use o código abaixo. Eu tive esse problema, minha localidade definir AM / PM como DE. Não tenho certeza porque … <#setting locale="en_US">

Resposta 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)); 

Isso produz um LocalDateTime de 2010-09-01T11: 34: 35. Cuidado com os dois anos de digitação, no entanto; DateTimeFormatter assumirá de 2000 a 2099. No meu aniversário, isso estaria incorreto.

Ainda precisamos fornecer o local. Como os marcadores AM / PM dificilmente são usados ​​na prática em outros locais além do inglês, considerei Locale.ENGLISH uma aposta bastante segura. Por favor, substitua o seu próprio.

As outras respostas foram bem respostas em 2010 e 2011. Já em 2014 o acima foi válido e eu teria preferido.