ti-enxame.com

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

A string que desejo formatar se parece com esta: String datetime = "9/1/10 11:34:35 AM"

O 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, preciso analisar o marcador AM/PM também e, quando o adiciono 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 não consigo encontrar onde eu fazer errado.

Alguma sugestão?

18
aksamit

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

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

Estou pegando 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.

3
droidd

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. No entanto, cuidado com os anos de dois dígitos; DateTimeFormatter assumirá de 2000 a 2099. Para 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.

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

1
Ole V.V.

Se você estiver trabalhando com o FreeMarker para Java e falar sobre esse problema, use o código abaixo. Eu tive esse problema, minha localidade definiu AM/PM como DE. Não tenho certeza por que ... <#setting locale="en_US">

0
Marek Tuchalski