[RESOLVIDO] Data em JAVA

Boa noite galera,

Bem, estou desenvolvendo um sistema em JAVA e me deparei com um problema, é muito importante que eu salve no Banco de Dados a data de certas transações.
Até ai tudo bem, estou usando este código pra pegar o valor de data.

       Date data = new Date();
        SimpleDateFormat formatador = new SimpleDateFormat("yyyy-MM-dd");
        
        formatador.format( data );
        obj.setDataDia(data);

E quando vou salvar, utilizo:
stmt.setDate(1, new java.sql.Date(obj.getDataDia().getTime()));

Só adicionei os códigos pra verem como estou fazendo. No entanto o problema é, caso eu altere a data manualmente no meu computador ou dê algum erro na data do PC, a transação será registrada com a data errada.

Existe uma forma de não correr o risco deste erro?
Qual a melhor forma de trabalhar nesse caso?

Agradeço.

Pega a data de servidor:

https://ntp.br/

1 curtida

Ola

existem muitas consequencias nefastas se o computador que o seu codigo esta rodando tiver a data muito errada.

vc inserir com data errada é o de menos, toda a parte de certificados digitais ( HTTPS / SSL ) é baseado em datas ( coloque a data do seu PC para 10 anos atras e tente acessar alguma coisa pelo browser para vc ver ). uma cadeia de certificados digitais possuem um periodo de validade que se não for observada ele não é considerado valido.

isso pode incluir a conexão com o banco de dados (se for usado SSL ) caso o servidor seja outra maquina.

O que normalmente se faz é admitir que a data do servidor nunca estara muito errada. os modernos sistemas operacionais podem utilizar um serviço de NTP que vai garantir que tudo esteja certo.

De qualquer forma, existem coisas que podem acontecer:

  1. entre o new Date() e inserir o mesmo no banco de dados pode decorrer algum tempo. se o seu codigo possui multiplas threads e vc não tem muito controle sobre a execuçao, vc pode ter uma surpresa na hora de inserir. E isso, meu amigo, é um sinal de que existem mais coisas erradas acontecendo envolvendo concorrencia.

  2. seu processo pode ser suspenso / voltar e eu não sei como a JVM lida com isso ( no mundo unix vc pode suspender um processo com um Control + Z ). Para isso entram dois conceitos: segurança e monitoramento.

Um sistema seguro vai ter um minimo de pessoas capazes de suspender um processo
Um sistema com monitoramento vai detectar q uma JVM parou de responder

  1. a data do servidor pode estar errada. aqui entra a divisão de responsabilidades: o que acontece entre o Sistema Operacional ( e o hardware ) e o seu codigo pode não estar no seu controle. Algumas coisas vc pode evitar ( pode ser paranoia, pode não ser ) mas é impossivel fazer um sistema a prova de tudo ( ou é muito caro ). Imagina que o HD pifou… o que vc pode fazer? Ou acabou a memoria? De fato, isso é a disciplina de Analise de Riscos e vc vai tentar desvendar os Riscos, como prevenir e o que fazer. Em algumas empresas vc precisa de um documento que tenha um passo a passo de como resolver determinadas coisas (tipo: acabou a memoria, então muda o parametro X da JVM ou coloque mais maquinas disponiveis ( pode ser um ambiente de Cloud Computing )

E digo mais, se vc não tem controle sobre o sistema operacional, um contrato precisa ser firmado, seja entre times ou entre empresas. Nesse contrato a responsabilidade da hora é de um determinado grupo e vc pode confiar baseada em uma cadeia de confiança.

Por exemplo, eu posso editar um .jar e enfiar um codigo malicioso em produção. Vc não tem como evitar isso pois é um esforço de varias areas de responsabilidade ( por exemplo usar jars assinados digitalmente ). Pra vc é apenas um codigo que acessa o banco de dados.

E se alguem entrar no banco e deletar todas as tabelas? é a mesma coisa. A area de segurança precisa evitar, A area de administração de banco e dados vai ter os backups e a Area de operação vai tentar restaurar. se o cara apagou o banco pq vc esqueceu de usar PreparedStatement e inventou de concatenar strings pra gerar sql então a culpa foi sua, lição aprendida vc não erra mais. Mas vai envolver multiplas pessoas e vc não deveria ser paranoico com “puxa e se não houver tabelas?”.

Se não tiver tabelas então o programa todo vai pifar.

Se o que vc esta fazendo é muito importante, tente se certificar de que todas as areas estão trabalhando direitinho. senão não adianta nada vc se preocupar com a data - outros problemas piores virão.

3 curtidas

Perfeito, obrigado Abner pela sugestão.
E obrigado peczenyj, pelo artigo de esclarecimento. Muito bom!