String to Date...parse nao funciona

24 respostas
Rage

Tenho uma data que já vem do banco formatada da maneira que eu rpeciso recuperá-la, porém ela vem como string, e preciso transformá-la em Date.

Seria algo como:

String myDt = "20060201"; Date dt = (Date) myDt; Só que isso não funciona.

Como transformar uma String em Date?
Somebody help please!!!
Vlw[]´s

24 Respostas

ddduran

por que os tipos não são compativeis, a estrutura das classes são diferentes.

você pode usar o
SimpleDateFormat
http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html

é só dazer assim

SimpleDateFormat sdf = new SimpleDateFormat(formatoQueEstaMinhaDataEmString); // no caso SimpleDateFormat(“yyyyMMdd”);
Date d = sdf.parse(myDt);

Rage

Certo kra, vlw pela resposta aí, mas o resultado disso que vc sugeriu é o seguinte:

Eu estava fazendo algo bem parecido com isso, mas aí ele muda totalmente…
No caso o que eu preciso é um atributo do tipo DATE com o seguinte valor: 20060606

Como se fosse:

Date dt = new Date(); dt = "20060606";

Mas tá brabo…
D qq forma vlw pela ajuda.

D

está aparecendo assim pq vc está printando o Date… para mostrar no formato String deverá usar o mesmo esquema que o ddduran disse mas ao invés de parse(), usar o format()… aí vai te retornar a String formatada do jeito que vc quer…

Rage

String myDt = "20060201"; SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); Date d = sdf.parse(myDt); System.out.println(sdf.format(d));

Certo, o resultado disso é:

Porém em forma de String. Mas como obter este resultado em forma de Date?

L

Só exemplificando o que o pessoal falou:

Se você quer um padrão de data com 20061228, use o seguinte:

SimpleDateFormat sdf = new SimpleDateFormat("ddmmyyyy");
       Date d = null;
	try {
		d = sdf.parse("10122005");
	} catch (ParseException e) {
		System.err.println("Erro ao transformar a data");
	}
	System.out.println(sdf.format(d));
Rage

String myDt = "20060201"; SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); Date d = sdf.parse(myDt); System.out.println(sdf.format(d));

Certo, o resultado disso é:

Porém em forma de String. Mas como obter este resultado em forma de Date?

L

Só exemplificando o que o pessoal falou:

Se você quer um padrão de data com 20061228, use o seguinte:

SimpleDateFormat sdf = new SimpleDateFormat("ddmmyyyy");
       Date d = null;
	try {
		d = sdf.parse("10122005");
	} catch (ParseException e) {
		System.err.println("Erro ao transformar a data");
	}
	System.out.println(sdf.format(d));
D

em forma de Date é o próprio Date… usa com sdf.parse()
pronto… vc está com um Date…

o que acontece é que vc está printando o objeto Date… e aí a data sempre vai sair por extenso pois esta é a implementacao do método toString() do objeto Date…

pode ficar com o Date na mao… ele é seu objeto certo… e se por acaso quiser printar o valor dele no seu formato, aí usa o método format()… que obviamente (e corretamente) sempre será uma String

Rage

Entendí o q vc está falando, vc realmente tem razão.
Porém neste caso, eu estava dando o print só pra conferir o valor, na verdade eu nao tenho necessidade de printar esse cara nao.
Como eu disse, esse campo é uma coluna do tipo DATE no oracle, que ao selecioná-la faço um TOCHAR()

select TO_CHAR(tab.col,'YYYYMMDD') rotulo

Então ela vem pra mim como String, e preciso tranformá-la em Date.
Meu Deus, será q é tão complikdo??? :-o

De String para Date…

String datadoBanco = "20070707"; Date datadoBean = (Date)datadoBanco;

Seria algo tipo isso, já q isso não funciona… :frowning:

[]´s

Rage

Entendí o q vc está falando, vc realmente tem razão.
Porém neste caso, eu estava dando o print só pra conferir o valor, na verdade eu nao tenho necessidade de printar esse cara nao.
Como eu disse, esse campo é uma coluna do tipo DATE no oracle, que ao selecioná-la faço um TOCHAR()

select TO_CHAR(tab.col,'YYYYMMDD') rotulo

Então ela vem pra mim como String, e preciso tranformá-la em Date.
Meu Deus, será q é tão complikdo??? :-o

De String para Date…

String datadoBanco = "20070707"; Date datadoBean = (Date)datadoBanco;

Seria algo tipo isso, já q isso não funciona… :frowning:

[]´s

ddduran

Trabalhar com data é sempre traumatizante em qualquer linguagem, mas especialmente em java é o triplo…

bem vindo ao Java :smiley:

Rage

hahahahah, porque eu não estou surpreso?? :slight_smile:

Java tem horas q é phoda!!!

D

cast direto de String para Date nao vai funcionar nunca. só com o sdf.parse()… nao vejo complicação nisso… já até postaram um pedaço que código que faz isso

D

agora, se vc for manipular datas… aí sim dou razão para o ddduran… a API de Calendar do Java é realmente porca.

mas nem por isso é o fim do mundo… existem projetos open source que tratam datas com mais facilidade… como o Joda Time

ou aguarde a JSR-310

Rage
Kra, vc tem certeza disso? Veja a seguir:
LogsAtualizacao la = new LogsAtualizacao();
	
String myDt = "20060201";  //fictício, vem do banco, numa String
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); 
Date d = sdf.parse(myDt);						
		
la.setDatUltMovimentacaoUf(d); //este método só aceita Date
		
System.out.println(la.getDatUltMovimentacaoUf());
Resultado:
Wed Feb 01 00:00:00 BRST 2006
Ou então tem alguma cosia q eu não estou enxergando...
D

cara, ja disse…

vc está printando um objeto Date. e SEMPRE vai ser printado por extenso qdo der system.out.println num Date…

Deixa eu te explicar uma coisa sobre Objetos

Em java, TODO e qualquer objeto é filho da classe Object.
Object tem um método chamado toString() que a implementação nada mais é que o nome da classe mais o seu hashcode…

Toda vez que vc manda printar um objeto, o método toString() será invocado. SEMPRE.

algumas vezes queremos mostrar alguma coisa mais do que simplesmente mostrar o nome da classe mais o hashcode… é entao que o método toString() é sobreescrito. E isso acontece com o Date.
A implementação do toString() dele é diferente… foi implementado para mostrar o Date por extenso.

resumindo: toda vez que vc printar um Date, a data vai sair por extenso…
quer mostrar a data em outro formato? use o SimpleDateFormat:

printe o sdf.format(date) que aí sim vc vai conseguir mostrar o formato desejado

Rage

Daniel, obrigado pela sua ajuda kra.
Legal o que você disse, valeu mesmo, eu não sabia dessas coisas. :?

O que me deixou com a pulga atrás da orelha, foi que mesmo no debug(Eclipse), onde ele mostra os valores das variáveis, veio este formato por extenso, eu não estava nem printando nada, mas mostrou assim. Provavelmente pelo fato do toString() ser chamado automaticamente quando printa.

Então não tem jeito de ver o formato como está…talvez inserindo no banco. Vou tentar assim.

Vlw[]´s

gomesrod

Ou em outras palavras:

A variavel Date não guarda o valor que você atribuiu, ou seja "20060707".
O que foi armazenado na variável Date é a data 07 de Julho de 2006.

Depois de atribuido um valor para a Data ela não tem nenhum compromisso de exibi-lo usando o mesmo formato que você.

Se você pede para imprimir a representação em String da Data, ela vai fazê-lo do jeito que sabe fazer, que é escrevendo a data por extenso.

Para imprimir a data em um formato qualquer (yyyyMMdd, dd/MM/yyyy, etc etc) você precisa realizar um processo específico, que "lê" a data e monta a String como desejado.

String myDt = "20060707";   
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMdd");
java.util.Date d = sdf.parse(myDt);

System.out.println("Representacao String do objeto Date: " + d);
System.out.println("Veja que ele possui o valor 07 de julho de 2006 (correto!)");

System.out.println("Mas se você precisa formatar a data usando o seu formato, precisa fazer isso:");
System.out.println("sdf.format(d): " + sdf.format(d));
Rage

Entendí kras…
O meu lance aquí não seria exatamente imprimir, mas apenas me certificar de que estou populando o bean com o dado no formato correto.
Porém mesmo assim foi ótimo, excelente tomar conhecimento do que vcs estão dizendo a respeito do Date em java, pois eu não sabia dessas coisas.

Como eu tenho uma validação de campos, toda vez que tento validar este campo ele é recusado, justamente por ser obrigatório o formato yyyyMMdd. Qd vem a data por extenso, dá M…

Mas uma coisa está estranho: o verdadeiro valor neste caso é 20070707, porém se eu mandar imprimir ele imprime por extenso.
Ok. Mas pq não passa na validação então?

Obrigado.

Rage

Ae pessoal, valeu pela ajuda mais uma vez, acho que finalmente conseguí entender o que vcs estavam querendo me dizer!!!

dt = sdf.parse(rSet[4]); la.setDatUltMovimentacaoUf(dt); ci.setLogsAtualizacao(la); resVal = vnum.ValidaData(sdf.format(ci.getLogsAtualizacao().getDatUltMovimentacaoUf()));

Agora foi!!! :slight_smile:

[]´s!!!

D

:smiley:

Parabéns, cara!

vc foi persistente pra entender o q tava acontecendo e foi até o final…
e o melhor, entendeu como funciona e não ficou só pedindo a solução pronta como mta gente faz…

esse é o caminho!

abraços

M
Opa beleza?Vai um metodo que retorna para data:
public Date toData(String data) {
      df = DateFormat.getDateInstance();
      dat=null;
      try {
    	  if(validaData(data)==true){
    		  dat = df.parse(data);
    	  }else{}
    		  
    		 
      }catch(ParseException e) {
    	  JOptionPane.showMessageDialog(null, e, "Aviso!!", JOptionPane.WARNING_MESSAGE);
      }

	 return dat; 
   }
   [code]
hover

Bom, pelo q eu entendi, vc está tentando carregar esta data do banco de dados … da p/ vc usar o metodo getDate o ResultSet.

Caso precise transformar de string p/ Date e Date p/ string msm é soh utilizar o código jah postado. Porem quando vc for exibir o conteudo, vc precisa de outro SimpleDateFormat com o formato q deseja exibir. Depois q vc pega o jeito eh simples, principalmente levando em conta q a Classe Date guarda a data em milisegundos (desde 1/1/1970).

SimpleDateFormat formatoBD = new SimpleDateFormat("yyyymmdd");
   Date d = null;
   try {  
      d = formatoBD.parse("20051210");
   } catch (ParseException e) {  
      System.err.println("Erro ao transformar a data");  
   }
   
   SimpleDateFormat formatoPrint = new SimpleDateFormat("dd/mm/yyyy");
   System.out.println(formatoPrint.format(d));

Espero que tenha esclarecido.

R

Rage:
Ae pessoal, valeu pela ajuda mais uma vez, acho que finalmente conseguí entender o que vcs estavam querendo me dizer!!!

dt = sdf.parse(rSet[4]); la.setDatUltMovimentacaoUf(dt); ci.setLogsAtualizacao(la); resVal = vnum.ValidaData(sdf.format(ci.getLogsAtualizacao().getDatUltMovimentacaoUf()));

Agora foi!!! :slight_smile:

[]´s!!!

Rage,

Apenas uma dica… tente não utilizar nome de variáveis como ‘resVal’ ou ‘vnum’, com as IDE’s de hoje, não justifica o uso de abreviações (ctrl+espaço no Eclipse nos ajuda!), a não ser que estes nomes realmente representam algo em seu sistema. Procure utilizar nomes completos…

flw!

Criado 17 de setembro de 2007
Ultima resposta 18 de set. de 2007
Respostas 24
Participantes 8