1
resposta

new Date de construtor pega valor incorreto

Minha classe tem um atributo do tipo Date e esse atributo precisa ser passado no construtor, porém quando isso acontece, ele não guarda o valor correto... Insira aqui a descrição dessa imagem para ajudar na acessibilidade Insira aqui a descrição dessa imagem para ajudar na acessibilidade por que ele aparentemente guarda com gregorian date? Eu não consigo converter de volta.

import java.text.SimpleDateFormat;
import java.util.Date;

public class Jogador {
    private int id;
    private String nome;
    private String apelido;
    private Date dataNascimento;
    private int numero;
    private String posicao;
    private int qualidade;
    private int cartoesAmarelo;
    private int cartaoVermelho;
    private Boolean suspenso;

    public Jogador() {

    }

    public Jogador(int id, String nome, String apelido, int ano, int mes, int dia, int numero, String posicao, int qualidade, int cartoesAmarelo, int cartaoVermelho, Boolean suspenso) {
//        dataNascimento = new Date(ano, mes, dia);

        this.id = id;
        this.nome = nome;
        this.apelido = apelido;
        this.dataNascimento = new Date(ano, mes, dia);
        this.numero = numero;
        this.posicao = posicao;
        this.qualidade = qualidade;
        this.cartoesAmarelo = cartoesAmarelo;
        this.cartaoVermelho = cartaoVermelho;
        this.suspenso = suspenso;
    }


    public Boolean isApto() {
        if (cartoesAmarelo > 2 || cartaoVermelho > 0) {
            return false;
        }
        return true;
    }

    public void aplicarCartaoAmarelo(int cartao) {
        cartoesAmarelo += cartao;
    }

    public void aplicarCartaoVermelho() {
        cartaoVermelho++;
    }

    public void cumprirSuspensao() {
        cartaoVermelho = 0;
        cartoesAmarelo = 0;
    }

    @Override
    public String toString() {

        String apto;
        if(isApto() == true) {
            apto = "PODE JOGAR";
        } else {
            apto = "SUSPENSO";
        }
        String data = new SimpleDateFormat("yyyy-MM-dd").format(dataNascimento);
        return posicao + ": " + numero + " - " + nome + " (" + apelido + ") - " + data + " CONDIÇÃO: " + apto;
    }
}
1 resposta

Ola Carolina.

A criação de uma data em java pelo construtor da classe Date não é legal mesmo não, ela até esta depreciada: https://docs.oracle.com/javase/8/docs/api/java/util/Date.html. Interessante notar que o construtor que recebe milesegundos funciona de boa.

Em java pré 8, usariamos a classe GregorianCalendar para esse fim. Agora se vc usa java 8+, melhor usar a classe DateTime.

Outra coisa importante a analisar é que quando tratamos datas, temos que levar em conta o locale que o sistema está. Se não foi indicado ao sistema o locale (seja por codigo ou variavel de ambiente), normalmente ele referencia ao locale do sistema operacional, oq pode te dar resultados diferentes ao exibir uma data.

Pra setar o locale via código: (note que na web, essa conf normalmente fica a cargo do servidor)

TimeZone.setDefault(TimeZone.getTimeZone("America/Sao_Paulo"));

Ou quando for exibir:

SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss", new Locale("pt", "BR"));