Como analisar uma data?

Eu estou tentando analisar essa data com SimpleDateFormat e não está funcionando:

 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Formaterclass { public static void main(String[] args) throws ParseException{ String strDate = "Thu Jun 18 20:56:02 EDT 2009"; SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); Date dateStr = formatter.parse(strDate); String formattedDate = formatter.format(dateStr); System.out.println("yyyy-MM-dd date is ==>"+formattedDate); Date date1 = formatter.parse(formattedDate); formatter = new SimpleDateFormat("dd-MMM-yyyy"); formattedDate = formatter.format(date1); System.out.println("dd-MMM-yyyy date is ==>"+formattedDate); } } 

Se eu tentar este código com strDate = "2008-10-14" , tenho uma resposta positiva. Qual é o problema? Como posso analisar este formato?

PS. Eu tenho essa data de um jDatePicker e não há instruções sobre como modificar o formato de data que recebo quando o usuário escolhe uma data.

Você não pode esperar analisar uma data com um SimpleDateFormat configurado com um formato diferente.

Para analisar sua string de data “Thu Jun 18 20:56:02 EDT 2009” você precisa de um SimpleDateFormat assim (aproximadamente):

 SimpleDateFormat parser=new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy"); 

Use isso para analisar a sequência em uma Data e, em seguida, em outro SimpleDateFormat para transformar essa Data no formato desejado.

  String input = "Thu Jun 18 20:56:02 EDT 2009"; SimpleDateFormat parser = new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy"); Date date = parser.parse(input); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); String formattedDate = formatter.format(date); ... 

JavaDoc: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

O problema é que você tem uma data formatada assim:

 Thu Jun 18 20:56:02 EDT 2009 

Mas estão usando um SimpleDateFormat que é:

 yyyy-MM-dd 

Os dois formatos não concordam. Você precisa construir um SimpleDateFormat que corresponda ao layout da string que você está tentando analisar em uma Data. Alinhando as coisas para facilitar a visualização, você quer um SimpleDateFormat assim:

 EEE MMM dd HH:mm:ss zzz yyyy Thu Jun 18 20:56:02 EDT 2009 

Verifique a página do JavaDoc a que me vinculei e veja como os caracteres são usados.

Agora temos uma maneira mais moderna de fazer esse trabalho.

java.time

O framework java.time é empacotado com o Java 8 e posterior. Veja o tutorial . Essas novas classs são inspiradas no Joda-Time , definidas pela JSR 310 e ampliadas pelo projeto ThreeTen-Extra . Eles são uma grande melhoria em relação às classs antigas problemáticas, java.util.Date/.Calendar et al.

Observe que os códigos de 3 a 4 letras, como o EDT não são padronizados nem exclusivos. Evite-os sempre que possível. Aprenda a usar os formatos padrão ISO 8601 . O framework java.time pode levar uma tentativa de tradução, mas muitos dos códigos comumente usados ​​possuem valores duplicados.

A propósito, observe como java.time, por padrão, gera strings usando os formatos ISO 8601, mas estendido anexando o nome do fuso horário entre colchetes.

 String input = "Thu Jun 18 20:56:02 EDT 2009"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "EEE MMM d HH:mm:ss zzz yyyy" , Locale.ENGLISH ); ZonedDateTime zdt = formatter.parse ( input , ZonedDateTime :: from ); 

Despeje para consolar.

 System.out.println ( "zdt : " + zdt ); 

Quando correr.

zdt: 2009-06-18T20: 56: 02-04: 00 [América / Nova_York]

Ajustar o fuso horário

Por diversão, vamos nos ajustar ao fuso horário da Índia.

 ZonedDateTime zdtKolkata = zdt.withZoneSameInstant ( ZoneId.of ( "Asia/Kolkata" ) ); 

zdtKolkata: 2009-06-19T06: 26: 02 + 05: 30 [Ásia / Calcutá]

Converta para juDate

Se você realmente precisa de um object java.util.Date para uso com classs ainda não atualizadas para os tipos java.time, converta. Observe que você está perdendo o fuso horário atribuído, mas tem o mesmo momento ajustado automaticamente para UTC .

 java.util.Date date = java.util.Date.from( zdt.toInstant() ); 

Como sobre getSelectedDate ? De qualquer forma, especificamente em sua questão de código, o problema é com esta linha:

 new SimpleDateFormat("yyyy-MM-dd"); 

A string que entra no construtor deve corresponder ao formato da data. A documentação de como fazer isso está aqui . Parece que você precisa de algo próximo a “EEE MMM d HH: mm: ss zzz aaaa”

Em resposta a: ” Como converter ter 13 de setembro de 2016 00:00:00 GMT-0500 (Hora de verano central (México)) para dd-MM-aa em Java? “, Foi marcado como duplicado

Tente isto: com java.util.Date , java.text.SimpleDateFormat , é uma solução simples.

 public static void main(String[] args) throws ParseException { String fecha = "Tue Sep 13 2016 00:00:00 GMT-0500 (Hora de verano central (México))"; Date f = new Date(fecha); SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); sdf.setTimeZone(TimeZone.getTimeZone("-5GMT")); fecha = sdf.format(f); System.out.println(fecha); }