Como receber data formatada de um campo DATATIME

Olá pessoal baixei uma arquivo da internet que importa um campo calendário porém o retorno dele é sempre uma data extensa da seguinte forma: Thu Sep 02 11:14:59 BRT 2021, deixarei o mesmo abaixo para testes.
Gostaria de saber se existe alguma maneira de extrair somente a data para um formato de banco de dados: yyyy-MM-dd.
Desde já sou grato pela atenção e ajuda de todos!!!

https://toedter.com/jcalendar/
jcalendar-1.4.zip (959,5,KB)

Pelo que pesquisei sobre esse componente, ele tem um método que retorna um objeto de data já. Como vc está usando ele?

1 curtida

Olá Lucas, tentei utilizar da seguinte forma:

try {
        SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
        Date data = formato.parse(this.txtDataRecebimento.getDate().toString());
        System.out.println(data);
    } catch (Exception e) {
        System.out.println("Erro: " + e.getMessage());
    }

Ele me retorna um erro informando que não é um tipo compatível de data.
Erro: Unparseable date: “Thu Sep 02 09:48:15 BRT 2021”
Não sei se estou usando um retorno errado do campo, mas o único que achei foi esse.

Acho que consegui fazer aqui. Veja se é isso que tu precisa:

import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

import com.toedter.calendar.JCalendar;

public class Main {
	
	private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");

	public static void main(String[] args) throws Exception {
		final JFrame janela = new JFrame("JCalendar");
		janela.setLayout(new GridBagLayout());
		
		final JCalendar calendarComponent = new JCalendar(new Date(), Locale.getDefault());
		
		JButton btn = new JButton("Mostrar data selecionada");
		btn.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				String dataFormatada = DATE_FORMAT.format(calendarComponent.getDate());
				JOptionPane.showMessageDialog(janela, "A data selecionada é: " + dataFormatada);
			}
		});
		
		janela.add(calendarComponent, 0);
		janela.add(btn, 1);
		
		janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		janela.setLocationRelativeTo(null);
		janela.pack();
		janela.setVisible(true);
	}
}

image

Usei a versão 1.4 do JCalendar: https://mvnrepository.com/artifact/com.toedter/jcalendar/1.4

1 curtida
try {
    Date data = txtDataRecebimento.getDate();
    SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
    System.out.println(formato.format(data));
} catch (Exception e) {
    System.out.println("Erro: " + e.getMessage());
}
2 curtidas

Se esse método já retorna um Date, então bastaria fazer:

Date data = this.txtDataRecebimento.getDate();

Não tem porque transformar a data em string, para depois transformar em data de novo…


Antes de prosseguir, entenda uma coisa:

Datas NÃO têm formato

Uma data é apenas um conceito, uma ideia: ela representa um ponto na linha do tempo.

Por exemplo, a data de “15 de janeiro de 2020”, representa isso: o ponto específico do calendário que corresponde ao dia 15 do mês de janeiro do ano de 2020. Para expressar essa ideia em forma de texto, eu posso escrevê-la de diferentes formas:

  • 15/01/2020 (um formato bem comum em muitos países, incluindo o Brasil)
  • 1/15/2020 (o irritante formato americano, invertendo o dia e mês)
  • 2020-01-15 (o formato ISO 8601)
  • Quinze de Janeiro de 2020 (em bom português)
  • January 15th, 2020 (em inglês)
  • 2020年1月15日 (em japonês)
  • e muitos outros…

Repare que cada um dos formatos acima é diferente, mas todos representam a mesma data (os mesmos valores numéricos do dia, mês e ano).

Quando você salva uma data no banco de dados, ela é gravada em algum formato interno que só interessa ao banco de dados, mas que não importa para você. O que importa é: a data não está no formato X ou Y. O banco só guarda os valores (como ele faz não importa).

Quando você consulta a data no banco (com um SELECT), ou mostra na tela (com println), é claro que a data é mostrada em algum formato, mas isso não quer dizer que ela está naquele formato. Não está. Internamente ela só tem valores numéricos que representam o ponto específico do calendário que ela representa. Quando vc imprime a data, esses valores são convertidos para algum formato.

No caso do Java, datas são representadas por Date (ou, nas versões mais novas, por LocalDate, LocalDateTime, etc). Essas são classes que só tem valores numéricos. Ao imprimir com println, esses valores são convertidos para algum formato (para uma String contendo um texto que representa a data).

Sendo assim, você pode simplesmente salvar o Date no banco. Todas as API’s de banco de dados possuem a opção de salvar um objeto diretamente, então se o campo no banco de dados é do tipo DATE (ou DATETIME, TIMESTAMP, etc), não precisa converter a data para nenhum formato. Basta passar o Date diretamente.

Claro, se o campo for VARCHAR, aí teria que converter mesmo (ou mude para o tipo correto, que é o mais indicado).

2 curtidas

Obrigado a todos pela ajuda e dicas. Ajustando o código com a dica de cada um consegui realizar o que eu desejava, grato pela atenção de cada um e seu tempo.

Obrigado @hugokotsubo por esclarecer melhor a situação;
Obrigado @staroski Não tinha visto esse detalhe realmente funcionou;
Obrigado @Lucas_Camara com seu exemplo aprendi até a inserir um novo componente.

Grato pela ajuda de todos.

1 curtida