Pergunta

Esta questão já tem uma resposta aqui:

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.

Foi útil?

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);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top