Como analisar uma data? [duplicado]
-
14-09-2019 - |
Pergunta
Esta questão já tem uma resposta aqui:
- Java string a data de conversão 13 respostas
Eu estou tentando analisar esta data com SimpleDateFormat
e ele 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 esse código com strDate = "2008-10-14"
, eu 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 eu tenho quando o usuário escolhe uma data.
Solução
Você não pode esperar para analisar uma data com um SimpleDateFormat que está configurado com um formato diferente.
Para analisar a sua cadeia de data "Qui 18 junho 20:56:02 EDT 2009" você precisa de um SimpleDateFormat como esta (aproximadamente):
SimpleDateFormat parser=new SimpleDateFormat("EEE MMM d HH:mm:ss zzz yyyy");
Use para analisar a cadeia em uma data e, em seguida, seu outro SimpleDateFormat para transformar essa data no formato que você quiser.
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
Outras dicas
O problema é que você tem uma data formatado como este:
Thu Jun 18 20:56:02 EDT 2009
Mas a utilizar um SimpleDateFormat
que é:
yyyy-MM-dd
Os dois formatos não concordo. Você precisa construir um SimpleDateFormat
que coincide com o disposição da corda que você está tentando analisar em uma data. Alinhando as coisas para torná-lo fácil de ver, 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 JavaDoc I ligada e ver como os personagens são usados.
Agora temos uma forma mais moderna de fazer este trabalho.
java.time
O quadro java.time vem com Java 8 e posterior. Consulte Tutorial . Estas novas classes são inspirados por Joda-Time, definido por JSR 310 , e prorrogado pela ThreeTen-extra projeto. Eles são uma grande melhoria sobre as classes de idade problemáticos, java.util.Date/.Calendar et al.
Note que os 3-4 carta códigos como EDT
não são nem padronizados nem único. Evitá-los sempre que possível. Aprenda a usar ISO 8601 formatos padrão em vez disso. O quadro java.time pode tomar uma facada em tradução, mas muitos dos códigos comumente utilizados têm valores duplicados.
A propósito, observe como java.time por padrão gera strings utilizando os formatos ISO 8601, mas estendido anexando o nome do fuso horário entre parênteses.
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 );
Dump para console.
System.out.println ( "zdt : " + zdt );
Quando prazo.
zdt: 2009-06-18T20: 56: 02-04: 00 [América / New_York]
Ajuste de Fuso Horário
Para se divertir Vamos ajustar o fuso horário da Índia.
ZonedDateTime zdtKolkata = zdt.withZoneSameInstant ( ZoneId.of ( "Asia/Kolkata" ) );
zdtKolkata: 2009-06-19T06: 26: 02 + 05: 30 [Ásia / Kolkata]
Converter em j.u.Date
Se você realmente precisa de um objeto java.util.Date para uso com as classes ainda não atualizados para os tipos java.time, converso. Note-se que você está perdendo o fuso horário atribuído, mas têm o mesmo momento ajustado automaticamente para UTC .
java.util.Date date = java.util.Date.from( zdt.toInstant() );
Como sobre getSelectedDate ? De qualquer forma, especificamente sobre a sua pergunta código, o problema é com esta linha:
new SimpleDateFormat("yyyy-MM-dd");
A cadeia que vai no construtor tem de corresponder ao formato da data. A documentação para saber como fazer isso é aqui . Parece que você precisa de algo perto de "EEE MMM d HH: mm: ss zzz aaaa"
Em resposta a: " Como converter Tue 13 de setembro de 2016 00:00:00 GMT-0500 (Hora de verano central (México)) a dd-mm-aa em Java? ", que 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);
}