java.text.ParseException: Data não mensurável

Eu estou analisando exceção enquanto eu estou tentando seguir o código

String date="Sat Jun 01 12:53:10 IST 2013"; SimpleDateFormat sdf=new SimpleDateFormat("MMM d, yyyy HH:mm:ss"); Date currentdate; currentdate=sdf.parse(date); System.out.println(currentdate); 

Exceção

 Exception in thread "main" java.text.ParseException: Unparseable date: "Sat Jun 01 12:53:10 IST 2013" at com.ibm.icu.text.DateFormat.parse(DateFormat.java:510) 

input: Sat Jun 01 12:53:10 IST 2013

Jun 01,2013 12:53:10 esperada: Jun 01,2013 12:53:10

Como resolver isso?

Seu padrão não corresponde à string de input … Não é de surpreender que não funcione. Isso provavelmente funcionaria melhor:

 SimpleDateFormat sdf = new SimpleDateFormat("EE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH); 

Então, para imprimir com o formato necessário, você precisa de um segundo SimpleDateFormat:

 Date parsedDate = sdf.parse(date); SimpleDateFormat print = new SimpleDateFormat("MMM d, yyyy HH:mm:ss"); System.out.println(print.format(parsedDate)); 

Notas:

  • você deve include a localidade como se sua localidade não fosse inglesa, o nome do dia pode não ser reconhecido
  • O IST é ambíguo e pode causar problemas, portanto, você deve usar o nome de fuso horário apropriado, se possível, na sua input.
  String date="Sat Jun 01 12:53:10 IST 2013"; SimpleDateFormat sdf=new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy"); Date currentdate=sdf.parse(date); SimpleDateFormat sdf2=new SimpleDateFormat("MMM dd,yyyy HH:mm:ss"); System.out.println(sdf2.format(currentdate)); 

Padrão está errado

  String date="Sat Jun 01 12:53:10 IST 2013"; SimpleDateFormat sdf=new SimpleDateFormat("E MMM dd hh:mm:ss Z yyyy"); Date currentdate; currentdate=sdf.parse(date); System.out.println(currentdate); 

Atualize seu formato para:

 SimpleDateFormat sdf=new SimpleDateFormat("E MMM dd hh:mm:ss Z yyyy"); 

Eu encontrei uma solução simples para obter data atual sem qualquer erro de análise.

 Calendar calendar; calendar = Calendar.getInstance(); String customDate = "" + calendar.get(Calendar.YEAR) + "-" + (calendar.get(Calendar.MONTH) + 1) + "-" + calendar.get(Calendar.DAY_OF_MONTH); 
  • Seu padrão de formatação não corresponde à string de input, conforme observado por outras respostas.
  • Seu formato de input é terrível .
  • Você está usando classs de data-hora antigas problemáticas que foram suplantadas anos atrás pelas classs java.time .

ISO 8601

Em vez de um formato como o seu, use os formatos padrão ISO 8601 para trocar valores de data e hora como texto.

As classs java.time usam os formatos padrão ISO 8601 por padrão ao analisar / gerar cadeias.

Nome do fuso horário adequado

Especifique um nome de fuso horário adequado no formato de continent/region , como America/Montreal , Africa/Casablanca ou Pacific/Auckland . Nunca use a abreviação de 3 a 4 letras, como EST ou IST pois eles não são verdadeiros fusos horários, não são padronizados e nem mesmo exclusivos (!).

Seu IST pode significar a Hora Padrão da Islândia , a Hora Padrão da Índia , a Hora Padrão da Irlanda ou outras. As classs java.time são deixadas apenas para adivinhar, pois não há solução lógica para essa ambigüidade.

java.time

A abordagem moderna usa as classs java.time .

Defina um padrão de formatação para corresponder às suas sequências de input.

 String input = "Sat Jun 01 12:53:10 IST 2013"; DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss z uuuu" , Locale.US ); ZonedDateTime zdt = ZonedDateTime.parse( input , f ); 

zdt.toString (): 2013-06-01T12: 53: 10Z [Atlântico / Reykjavik]

Se sua input não foi destinada para a Islândia, você deve pré-analisar a seqüência para ajustar a um nome de fuso horário adequado. Por exemplo, se você tiver certeza de que a input foi planejada para a Índia, altere IST para Asia/Kolkata .

 String input = "Sat Jun 01 12:53:10 IST 2013".replace( "IST" , "Asia/Kolkata" ); DateTimeFormatter f = DateTimeFormatter.ofPattern( "EEE MMM dd HH:mm:ss z uuuu" , Locale.US ); ZonedDateTime zdt = ZonedDateTime.parse( input , f ); 

zdt.toString (): 2013-06-01T12: 53: 10 + 05: 30 [Ásia / Calcutá]


Sobre o java.time

O framework java.time está embutido no Java 8 e posterior. Essas classs substituem as antigas classs herdadas de data e hora legadas , como java.util.Date , Calendar e SimpleDateFormat .

O projeto Joda-Time , agora em modo de manutenção , aconselha a migration para as classs java.time .

Para saber mais, veja o Oracle Tutorial . E pesquise o Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .

Você pode trocar objects java.time diretamente com seu database. Use um driver JDBC compatível com o JDBC 4.2 ou posterior. Não há necessidade de strings, não há necessidade de classs java.sql.* .

Onde obter as classs java.time?

  • Java SE 8 , Java SE 9 , Java SE 10 e posterior
    • Construídas em.
    • Parte da API Java padrão com uma implementação integrada.
    • O Java 9 adiciona alguns resources e correções menores.
  • Java SE 6 e Java SE 7
    • Grande parte da funcionalidade java.time é transferida para o Java 6 e 7 no ThreeTen-Backport .
  • Android
    • Versões posteriores das implementações do pacote Android das classs java.time.
    • Para Android anterior (<26), o projeto ThreeTenABP adapta o ThreeTen-Backport (mencionado acima). Veja Como usar o ThreeTenABP… .

O projeto ThreeTen-Extra estende java.time com classs adicionais. Este projeto é um campo de testes para possíveis futuras adições ao java.time. Você pode encontrar algumas classs úteis aqui como Interval , YearWeek , YearQuarter e muito mais .

 String date="Sat Jun 01 12:53:10 IST 2013"; SimpleDateFormat sdf=new SimpleDateFormat("MMM d, yyyy HH:mm:ss"); 

Esses padrões não correspondem à sua input String, que ocorre na exceção .

Você precisa usar o seguinte padrão para realizar o trabalho.

 E MMM dd HH:mm:ss z yyyy 

O código a seguir ajudará você a ignorar a exceção .

SimpleDateFormat é usado .

  String date="Sat Jun 01 12:53:10 IST 2013"; // Input String SimpleDateFormat simpleDateFormat=new SimpleDateFormat("E MMM dd HH:mm:ss z yyyy"); // Existing Pattern Date currentdate=simpleDateFormat.parse(date); // Returns Date Format, SimpleDateFormat simpleDateFormat1=new SimpleDateFormat("MMM dd,yyyy HH:mm:ss"); // New Pattern System.out.println(simpleDateFormat1.format(currentdate)); // Format given String to new pattern // outputs: Jun 01,2013 12:53:10 

Eu precisava adicionar uma expressão ParsePosition ao método de análise da class SimpleDateFormat :

 simpledateformat.parse(mydatestring, new ParsePosition(0));