Não é possível analisar DateTime string com marcador de AM/PM
-
26-09-2019 - |
Pergunta
A seqüência de caracteres quero formato parecido com este:String datetime = "9/1/10 11:34:35 AM"
Seguinte padrão 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, eu preciso analisar o marcador de AM/PM, bem como, e quando devo acrescentar que, para o padrão que eu receber uma exceção.
Padrão que não funcionam:
SimpleDateFormat sdf = SimpleDateFormat("M/d/yy h:mm:ss a");
Eu tentei com este, 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 http://download.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html#text mas canät parecem encontrar onde eu faço de errado.
Alguma sugestão?
Solução
Uma possibilidade é que seu padrão Locale
tem símbolos diferentes para AM/PM. Ao construir um formato de data, você deve sempre fornecer um Locale
A menos que você realmente queira usar o padrão do sistema Locale
, por exemplo:
SimpleDateFormat sdf = new SimpleDateFormat("M/d/yy h:mm:ss a", Locale.US)
Outras dicas
Estou tomando um exemplo de data fornecida abaixo e imprimir a data formatada no formato 24 horas, se for adequado ao seu requisito.
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 consulta, responda. Obrigado.
Moderno resposta:
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 anos de dois dígitos, embora; DateTimeFormatter
irá assumir 2000 a 2099.Para o meu aniversário este teria sido incorreto.
Ainda precisamos fornecer a localidade.Desde AM/PM marcadores são pouco utilizados na prática em outros idiomas que não o inglês, eu considerados Locale.ENGLISH
uma aposta bastante segura.Por favor, coloque o seu próprio.
Outras respostas foram muito bem, respostas em 2010 e 2011.Já em 2014 o texto acima foi válido e eu teria preferido a ele.
Se você estiver trabalhando com o Freemarker para Java e pop sobre esse problema, use o código abaixo. Eu tive esse problema, meu conjunto de localidade AM/PM como DE. Não sei por que ...<#setting locale="en_US">