Boa noite, tenho um sistema desktop que fiz para o TCC da universidade, utilizei o NetBeans (6.1 ao 6.9)para desenvolver.
Agora um ano depois resolvi mexer nele a atualizar e adicionar algumas coisas. Agora optei pelo Eclipse pq comecei a usar no trabalho e percebi que ele era bem mais leve que o Netbeans.
A minha dúvida(problema) que que para pegar data e hora no sistema eu estou utilizando a API JSR-310 20090601, quando eu utilizava o NetBeans nunca tive problemas, mas agora, quando “ressuscitei” o código utilizando o Eclipse começou a dar um erro (postado abaixo). Já pesquisei em (quase) tudo, Google, Documentação da API, aqui no GUJ e não encontrei nada.
import javax.time.calendar.Clock;
import javax.time.calendar.LocalDate;
public class Data
{
public static String dataDoDia(){
LocalDate date;
date = Clock.systemDefaultZone().today();
String[] recorte = date.toString().split("-");
String datadehoje = recorte[2]+"/"+recorte[1]+"/"+recorte[0];
return datadehoje;
}
}
[size=18][color=red]ERRO[/color] [/size]
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Unsupported time zone: America/Sao_Paulo
at javax.time.calendar.TimeZone.timeZone(Unknown Source)
at javax.time.calendar.Clock.systemDefaultZone(Unknown Source)
at Util.Data.dataDoDia(Data.java:199)
at TelaMovimentacao.TelaEncomenda.<init>(TelaEncomenda.java:151)
at TelaCadastro.TelaPrincipal.abreTelaEncomenda(TelaPrincipal.java:488)
at TelaCadastro.TelaPrincipal.keyPressed(TelaPrincipal.java:798)
at java.awt.Component.processKeyEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Window.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.awt.EventQueue$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.awt.EventQueue$2.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Se alguem tiver alguma sugestão, agradeço.
Até mais.
Bem, não entendi o motivo de você ter complicado tanto uma coisa tão simples.
public static String dataDoDia() {
SimpleDateFormat df = new SimpleDateFormat( "dd/MM/yyyy" );
return df.format( new Date() );
}
O código acima resolve seu problema e você não vai precisar da Date/Time API se tiver usando-a só para isso, o que eu acho um desperdício se for o caso.
Quanto à excessão que está sendo lançada, parece que a versão da biblioteca que você está usando não suporta a time zone do PC que você está usando.
Você por acaso está fazendo isso no mesmo PC que desenvolveu o seu projeto? O JDK é o mesmo? O Windows é o mesmo? Ou seja, o seu ambiente é o mesmo?
Obrigado David, desculpa, eu não coloquei a classe inteira coloquei só o método que esta dando erro, na verdade esta minha classe tem outros método que uso para somar e diminuir valores de data mês e ano, gerar parcelamento automático de parcelas, eu só passo o variante, exemplo, gerar parcelas de 20 em 20 dias, esta minha classe recebe um int “20” e tem um método que faz a soma e retorna a data.
Quanto ao ambiente o PC é o mesmo, só que comecei desenvolvendo no Win XP 32 bits depois mudei para o 7 64 bits e funcionava, quando parei de mexer no sistema formatei a maquina algumas vezes, mas sempre usando o Netbeans. Outra coisa que esqueci de falar é que migrei de banco de dados na universidade utilizei o Firebird, pois não pensava em continuar desenvolvendo este sistema mas agora que vou fazer um teste experimental migrei para MySQL. Creio que esta informação seja irrelevante, pois ele não pega data do banco. Esta classe de Data só é invocada pelas tela do sistema, quando vai salvar em banco a data/hora já existe.
Vou reinstalar as JREs e JDKs para ver se pode ser isso.
Ta ai davidbuzatto, como prometido esta é a classe completa.
Ainda não fiz o teste, mas assim que eu tiver alguma resposta, positiva ou negativa eu mando aqui no Tópico.
Só uma coisa que está diferente, no log de erro está acusando a linha 199, mas na verdade o erro acontece na linha 196, ele gerou na 199 por que eu havia colocado alguns SysOut, mas sem sucesso.
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package Util;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JOptionPane;
import javax.time.calendar.Clock;
import javax.time.calendar.LocalDate;
/**
*
* @author Cassio
*/
public class Data {
public static String forDB1(String data){
try{
String[] recorte = data.split("/");
return recorte[2] + "-" + recorte[1] + "-" + recorte[0];
} catch (Exception e){
return null;
}
}
public static String forSoft(String data){
try{
String[] recorte = data.split("-");
return recorte[2] + "/" + recorte[1] + "/" + recorte[0];
} catch (Exception e){
return null;
}
}
public static boolean validaDataNascimento(String datanasc){
try {
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
Date datahj = new Date();
String data = SimpleDateFormat.getDateInstance(SimpleDateFormat.DATE_FIELD).format(datahj);
String[] recorte2 = data.split("/");
data = recorte2[0] + "/" + recorte2[1] + "/20" + recorte2[2];
String[] recorte = datanasc.split("/");
int aux = Integer.parseInt(recorte[2]);
aux = aux + 16;
recorte[2] = "" + aux;
datanasc = recorte[0] + "/" + recorte[1] + "/" + recorte[2];
Date datalimite = df.parse(data);
Date datacliente = df.parse(datanasc);
// JOptionPane.showMessageDialog(null, datalimite +" - " +datacliente);
if (datacliente.after(datalimite)) {
JOptionPane.showMessageDialog(null, "Data cliente maior que o limite");
return false;
}
return true;
} catch (ParseException ex) {
}
return true;
}
public static boolean validaData(String data) {
LocalDate date;
String[] recorte = data.split("/");
try {
date = LocalDate.date(Integer.parseInt(recorte[2]), Integer.parseInt(recorte[1]), Integer.parseInt(recorte[0]));
// JOptionPane.showMessageDialog(null, "date dentro do valida data: "+date);
} catch (Exception e) {
return false;
}
return true;
}
public static LocalDate getDataLocalDate(String data) {
LocalDate date;
String[] recorte = data.split("/");
date = LocalDate.date(Integer.parseInt(recorte[2]), Integer.parseInt(recorte[1]), Integer.parseInt(recorte[0]));
return date;
}
public static boolean verificaIdade(String data, int idade) {
boolean maior = false;
LocalDate date;
String[] recorte = data.split("/");
try {
date = LocalDate.date(Integer.parseInt(recorte[2]), Integer.parseInt(recorte[1]), Integer.parseInt(recorte[0]));
LocalDate hoje = Clock.systemDefaultZone().today();
LocalDate limite = hoje.minusYears(idade);
maior = date.isBefore(limite);
} catch (Exception e) {}
return maior;
}
public static boolean verificaDataMaior(String data){
//retorna verdadeiro para datas anteriores ou iguais ao dia de hoje
boolean maior = false;
LocalDate date;
String[] recorte = data.split("/");
try {
date = LocalDate.date(Integer.parseInt(recorte[2]), Integer.parseInt(recorte[1]), Integer.parseInt(recorte[0]));
LocalDate hoje = Clock.systemDefaultZone().today();
hoje = hoje.plusDays(1);
maior = date.isBefore(hoje);
} catch (Exception e) {}
return maior;
}
public static String criaDataSomandoValorInt(int carencia){
LocalDate dataparc = Clock.systemDefaultZone().today();
dataparc = dataparc.plusDays(carencia);
String[] recorte= dataparc.toString().split("-");
String novadata = recorte[2]+"/"+recorte[1]+"/"+recorte[0];
return novadata;
}
public static String geraDataParcela(String data, int passo){
LocalDate dataparc;
String[] recorte = data.split("/");
dataparc = LocalDate.date(Integer.parseInt(recorte[2]),Integer.parseInt(recorte[1]),Integer.parseInt(recorte[0]));
dataparc = dataparc.plusDays(passo);
recorte = dataparc.toString().split("-");
String novadata = recorte[2]+"/"+recorte[1]+"/"+recorte[0];
return novadata;
}
public static boolean verificaDataMenor(String data){
//retorna verdadeiro para datas posteriores ao dia de hoje
boolean maior = false;
LocalDate date;
String[] recorte = data.split("/");
try {
date = LocalDate.date(Integer.parseInt(recorte[2]), Integer.parseInt(recorte[1]), Integer.parseInt(recorte[0]));
LocalDate hoje = Clock.systemDefaultZone().today();
maior = date.isAfter(hoje);
// JOptionPane.showMessageDialog(null, maior);
} catch (Exception e) {}
return maior;
}
public static boolean verificaDataMenor(String data, String limite){
//retorna verdadeiro para datas posteriores ao dia limite
boolean maior = false;
LocalDate date;
LocalDate limitedata;
String[] recorte = data.split("/");
String[] recorte2 = data.split("/");
try {
date = LocalDate.date(Integer.parseInt(recorte[2]), Integer.parseInt(recorte[1]), Integer.parseInt(recorte[0]));
limitedata = LocalDate.date(Integer.parseInt(recorte2[2]), Integer.parseInt(recorte2[1]), Integer.parseInt(recorte2[0]));
maior = date.isAfter(limitedata);
JOptionPane.showMessageDialog(null, maior);
} catch (Exception e) {}
return maior;
}
public static String dataDoDia(){
LocalDate date;
date = Clock.systemDefaultZone().today();
String[] recorte = date.toString().split("-");
String datadehoje = recorte[2]+"/"+recorte[1]+"/"+recorte[0];
return datadehoje;
}
}
Olá a todos, estou eu aqui novamente
Conforme havia dito, realizei os teste com o JRE e JDK 64 bits e 32 tbm, mas infelizmente nada feito, continuou gerando o erro.
Resolvi tbm fazer o teste com o Netbeans mais atual, baixei o 7.0.1 e tbm nada feito.
Mas tem um outro ponto que descobri, como foi um projeto de TCC eu tenho um CD com todos os dados do projeto que inclui os fontes e um arquivo .jar para executar o sistema. Quando vi ele (o .jar) resolvi fazer um teste e verificar se o sistema iria executar normalmente. SURPRESA! O sistema rodou normalmente.
O que pode estar influenciando para o arquivo JAR rodar normal e quando executo via Eclipse ou Netbeans ele gera erro?
Boa tarde.
Após 3 ou 4 dias testando algumas alternativas, consegui resolver o problema, graças a ajuda de um amigo. Ele tbm utilizou esta mesma API para trabalhar com datas e hora, solicitei para ele se poderia realizar alguns testes. Pois bem, depois que ele fez os testes me envio o arquivo JAR que estava utilizando pois o seu codigo funcionou perfeitamente.
Substitui o meu arquivo pelo arquivo que ele me mandou e pronto, “voilà” funcionou.
O teste final que fiz as configurações do ambientes eram as seguintes:
Windows 7 - 64 bits
Eclipse Indigo - Build id: 20110916-0149
JRE 6 - 32 bits
JDK 1.6 - 32 bits