Java ajuda em codigo

Gostaria de saber como posso adicionar esses metodos no codigo abaixo e que minha ''toString()" de saida esteja no modo String.format() para formatar a string, já que tentei usar o metodo parse e não pode ser usado.
somadias(valor)
Soma à data atual o total de dias informado, fazendo desta a nova data. Deve ser levado em consideração a regra de limites de cada parâmetro. Se ultrapassar o valor máximo do ano, colocar o valor máximo.
subtrairdias(valor)
Subtrai da data atual o total de dias informado fazendo desta a nova data. Deve ser levado em consideração a regra de limites de cada parâmetro.
toString()
Deverá sobrescrever o método toString para devolver uma String com a data no formato “dia/mês/ano - sigla”, sendo o dia e o mês apresentados com dois dígitos e o ano com 4 dígitos. O ano deverá sempre ser apresentado sem sinal e a data deverá estar seguida da sigla “AC” para anos negativos e “DC” para anos positivos

public class DiaMesAno {
private int dia, mes, ano;

public static void main(String[] args) {

}
public DiaMesAno(int dia, int mes, int ano) {
if (!valido(dia, mes, ano)) { // se não válida, nem cria a instância, lança uma exceção para indicar que está errado
throw new IllegalArgumentException(“Valores inválidos”);
}
this.dia = dia;
this.mes = mes;
this.ano = ano;
}

private boolean bissexto(int ano) {
    return (ano % 4 == 0) && ((ano % 100) != 0 || (ano % 400) == 0);
}

private boolean valido(int dia, int mes, int ano) {
    if (mes < 1 || mes > 12) { // mês inválido
        return false;
    }
    // ver a quantidade de dias no mês
    int qtdDias = 31;
    if (mes == 4 || mes == 6 || mes == 9 || mes == 11) {
        qtdDias = 30;
    } else if (mes == 2) {
        qtdDias = bissexto(ano) ? 29 : 28;
    }
    if (dia < 1 || dia > qtdDias) {
        return false;
    }

    return true;
}

public int getDia() {
    return dia;
}

public int getMes() {
    return mes;
}

public int getAno() {
    return ano;
}

public void setDia(int dia) {
    // valida o novo dia, usando o mês e ano que já tem
    if (!valido(dia, this.mes, this.ano)) {
        throw new IllegalArgumentException("Valores inválidos");
    }
    this.dia = dia;
}

public void setMes(int mes) {
    // valida o novo mês, usando o dia e ano que já tem
    if (!valido(this.dia, mes, this.ano)) {
        throw new IllegalArgumentException("Valores inválidos");
    }
    this.mes = mes;
}
public void setAno(int ano) {
    // valida o novo ano, usando o mês e dia que já tem
    if (!valido(this.dia, this.mes, ano)) {
        throw new IllegalArgumentException("Valores inválidos");
    }
    this.ano = ano;
}

@Override
public String toString() {
    
    return "DiaMesAno{" + "=" + dia + ", mes=" + mes + ", ano=" + ano + '}';
    
    
}

}

Não consegui entender o que é pra fazer, nem o que vc tentou fazer e o que deu errado… :man_shrugging:

E por favor coloque o código formatado, basta selecioná-lo e usar o botão </> do editor:

2 curtidas

public class DiaMesAno {
private int dia, mes, ano;

public static void main(String[] args) {

}
public DiaMesAno(int dia, int mes, int ano) {
if (!valido(dia, mes, ano)) { // se não válida, nem cria a instância, lança uma exceção para indicar que está errado
throw new IllegalArgumentException(“Valores inválidos”);
}
this.dia = dia;
this.mes = mes;
this.ano = ano;
}
private boolean bissexto(int ano) {
return (ano % 4 == 0) && ((ano % 100) != 0 || (ano % 400) == 0);
}

private boolean valido(int dia, int mes, int ano) {
if (mes < 1 || mes > 12) { // mês inválido
return false;
}
// ver a quantidade de dias no mês
int qtdDias = 31;
if (mes == 4 || mes == 6 || mes == 9 || mes == 11) {
qtdDias = 30;
} else if (mes == 2) {
qtdDias = bissexto(ano) ? 29 : 28;
}
if (dia < 1 || dia > qtdDias) {
return false;
}

return true;

}

public int getDia() {
return dia;
}

public int getMes() {
return mes;
}

public int getAno() {
return ano;
}

public void setDia(int dia) {
// valida o novo dia, usando o mês e ano que já tem
if (!valido(dia, this.mes, this.ano)) {
throw new IllegalArgumentException(“Valores inválidos”);
}
this.dia = dia;
}

public void setMes(int mes) {
// valida o novo mês, usando o dia e ano que já tem
if (!valido(this.dia, mes, this.ano)) {
throw new IllegalArgumentException(“Valores inválidos”);
}
this.mes = mes;
}
public void setAno(int ano) {
// valida o novo ano, usando o mês e dia que já tem
if (!valido(this.dia, this.mes, ano)) {
throw new IllegalArgumentException(“Valores inválidos”);
}
this.ano = ano;
}

@Override
public String toString() {

return "DiaMesAno{" + "=" + dia + ", mes=" + mes + ", ano=" + ano + '}';

}
}
Quero adicionar os métodos somar dia diminuir dias e saber se a data é antes ou depois de Cristo

public class DiaMesAno {
private int dia, mes, ano;

public static void main(String[] args) {

}
public DiaMesAno(int dia, int mes, int ano) {
if (!valido(dia, mes, ano)) { // se não válida, nem cria a instância, lança uma exceção para indicar que está errado
throw new IllegalArgumentException(“Valores inválidos”);
}
this.dia = dia;
this.mes = mes;
this.ano = ano;
}
private boolean bissexto(int ano) {
    return (ano % 4 == 0) && ((ano % 100) != 0 || (ano % 400) == 0);
}

private boolean valido(int dia, int mes, int ano) {
    if (mes < 1 || mes > 12) { // mês inválido
        return false;
    }
    // ver a quantidade de dias no mês
    int qtdDias = 31;
    if (mes == 4 || mes == 6 || mes == 9 || mes == 11) {
        qtdDias = 30;
    } else if (mes == 2) {
        qtdDias = bissexto(ano) ? 29 : 28;
    }
    if (dia < 1 || dia > qtdDias) {
        return false;
    }

    return true;
}

public int getDia() {
    return dia;
}

public int getMes() {
    return mes;
}

public int getAno() {
    return ano;
}

public void setDia(int dia) {
    // valida o novo dia, usando o mês e ano que já tem
    if (!valido(dia, this.mes, this.ano)) {
        throw new IllegalArgumentException("Valores inválidos");
    }
    this.dia = dia;
}

public void setMes(int mes) {
    // valida o novo mês, usando o dia e ano que já tem
    if (!valido(this.dia, mes, this.ano)) {
        throw new IllegalArgumentException("Valores inválidos");
    }
    this.mes = mes;
}
public void setAno(int ano) {
    // valida o novo ano, usando o mês e dia que já tem
    if (!valido(this.dia, this.mes, ano)) {
        throw new IllegalArgumentException("Valores inválidos");
    }
    this.ano = ano;
}

@Override
public String toString() {
    
    return "DiaMesAno{" + "=" + dia + ", mes=" + mes + ", ano=" + ano + '}';
    
    
}
}`Texto pré-formatado`

Para ver se a data é Antes de Cristo, é só ver se o ano é menor que zero:

public boolean antesDeCristo() {
    return this.ano < 0;
}

Nesse caso o retorno é um booleano: se a data for AC, retorna true, senão, retorna false.

Não ficou claro o que é para retornar, mas você também poderia retornar uma string indicando a era:

public String getEra() {
    return this.ano < 0 ? "AC" : "DC";
}

Assim, o retorno será “AC” ou “DC”, conforme o valor do ano.


Já para somar e subtrair dias, você tem que verificar se mudou o mês e/ou o ano (por exemplo, 31 de janeiro + 2 dias = 2 de fevereiro, ou ainda 31 de dezembro + 2 dias = 2 de janeiro do ano seguinte).

Então primeiro eu sugiro adicionar um método para saber a quantidade de dias no mês (que você pode reaproveitar no método de validação):

private int ultimoDia(int mes, int ano) {
    if (mes == 4 || mes == 6 || mes == 9 || mes == 11) {
        return 30;
    } else if (mes == 2) {
        return bissexto(ano) ? 29 : 28;
    }
    return 31;
}

private boolean valido(int dia, int mes, int ano) {
    return 1 <= mes && mes <= 12 && 1 <= dia && dia <= ultimoDia(mes, ano);
}

E aí você pode fazer um método para somar 1 dia, e para somar vários dias, basta chamá-lo várias vezes:

private void somarUmDia() {
    this.dia++;
    if (this.dia > ultimoDia(this.mes, this.ano)) { // mudar para o mês seguinte
        this.mes++;
        this.dia = 1; // se mudou o mês, o próximo dia é 1
        if (this.mes > 12) { // mudou o ano
            this.mes = 1; // janeiro do ano seguinte
            this.ano++;
        }
    }
}

public void somarDias(int qtdDias) {
    for (int i = 0; i < qtdDias; i++) {
        this.somarUmDia();
    }
}

E o mesmo para subtrair:

private void subtrairUmDia() {
    this.dia--;
    if (this.dia == 0) { // mudar para o mês anterior
        this.mes--;
        if (this.mes == 0) { // mudar para o ano anterior
            this.ano--;
            this.mes = 12; // dezembro do ano anterior
        }
        this.dia = ultimoDia(this.mes, this.ano); // se mudou para o mês anterior, então deve ser o último dia deste
    }
}

public void subtrairDias(int qtdDias) {
    for (int i = 0; i < qtdDias; i++) {
        this.subtrairUmDia();
    }
}

Mas claro que esses algoritmos são bem ingênuos e nada eficientes: se eu somar mil dias, o último dia do mês é calculado mil vezes, etc.

Um algoritmo mais eficiente pode ser visto no código fonte da classe java.time.LocalDate, que converte a data para um epoch day (usando esses cálculos) e depois converte de volta para dia, mês e ano. Mas para um exercício - como parece ser o caso aqui - eu chutaria que o professor não espera que você faça algo tão sofisticado :slight_smile:

Até porque aritmética de datas não é tão simples quanto parece.


Obs: não precisava ter colocado o código de novo, bastava editar o post para arrumar a formatação :slight_smile:

1 curtida

teria como eu por um limite de 10000 mil dias?

public class DiaMesAno {
private int dia, mes, ano;

public static void main(String[] args) {

como posso fazer isso tudo virar uma class e puxar os seters aqui como dia, mes e ano?

}
//vou usar o tipo de exeção que estou aprendendo na plataforma cisco, curso que faço em java por fora da faculdade, esse Este tipo exceção geralmente é utilizada para validar valores de parâmetros que não estão nas condições adequadas ao programa, ou seja, você pode querer que um parâmetro do seu método que é do tipo inteiro, nunca seja maior que 100 para evitar falhas no sistema
public DiaMesAno(int dia, int mes, int ano) {
if (!valido(dia, mes, ano)) { // se não válida, nem cria a instância, lança uma exceção para indicar que está errado
throw new IllegalArgumentException(“Valores inválidos”);
}
this.dia = dia;
this.mes = mes;
this.ano = ano;
}
// se o ano for bissexto
public boolean bissexto(int ano) {
return (ano % 4 == 0) && ((ano % 100) != 0 || (ano % 400) == 0);
}
//ver se o ano é antes ou dps de cristo
public boolean antesdDeCristo(){
return this.ano < 0;
}
public String getEra() {
return this.ano < 0 ? “AC” : “DC”;
}

// ver a quantidade de dias no mês  
 
public int ultimoDia(int mes, int ano) {
if (mes == 4 || mes == 6 || mes == 9 || mes == 11) {
    return 30;
} else if (mes == 2) {
    return bissexto(ano) ? 29 : 28;
}
return 31;

}
public boolean valido(int dia, int mes, int ano) {
return 1 <= mes && mes <= 12 && 1 <= dia && dia <= ultimoDia(mes, ano);
}

public void somarUmDia() {
this.dia++;
if (this.dia > ultimoDia(this.mes, this.ano)) { // mudar para o mês seguinte
    this.mes++;
    this.dia = 1; // se mudar o mês, o próximo dia é 1
    if (this.mes > 12) { // mudou o ano
        this.mes = 1; // janeiro do ano seguinte
        this.ano++;
    }
}

}
//somar dias
public void somarDias(int qtdDias) {
for (int i = 0; i < qtdDias; i++) {
this.somarUmDia();
}
}
//subtrair dias
public void subtrairUmDia() {
this.dia–;
if (this.dia == 0) { // mudar para o mês anterior
this.mes–;
if (this.mes == 0) { // mudar para o ano anterior
this.ano–;
this.mes = 12; // dezembro do ano anterior
}
this.dia = ultimoDia(this.mes, this.ano); // se mudou para o mês anterior, então deve ser o último dia deste
}
}

public void subtrairDias(int qtdDias) {
for (int i = 0; i < qtdDias; i++) {
this.subtrairUmDia();
}
}

public int getDia() {
    return dia;
}

public int getMes() {
    return mes;
}

public int getAno() {
    return ano;
}

public void setDia(int dia) {
    // valida o novo dia, usando o mês e ano que já tem
    if (!valido(dia, this.mes, this.ano)) {
        throw new IllegalArgumentException("Valores inválidos");
    }
    this.dia = dia;
}

public void setMes(int mes) {
    // valida o novo mês, usando o dia e ano que já tem
    if (!valido(this.dia, mes, this.ano)) {
        throw new IllegalArgumentException("Valores inválidos");
    }
    this.mes = mes;
}
public void setAno(int ano) {
    // valida o novo ano, usando o mês e dia que já tem
    if (!valido(this.dia, this.mes, ano)) {
        throw new IllegalArgumentException("Valores inválidos");
    }
    this.ano = ano;
    
}

@Override
public String toString() {
    return "Data{" + "/" + dia + ", /" + mes + ", /" + ano +  '}';
}

}Texto pré-formatado

1 curtida

Que mania de não formatar o código nas suas postagens. :man_shrugging:
É tão fácil, veja:
formatacao-forum

Faz favor de editar seus post e formatar direitinho. :wink:

Ué mas DiaMesAno já é uma classe.

quando eu puxo os seter na clase main da o erro non-static variable this cannot be referenced from a static context alguem sabe como me ajudar, e como posso por uma toString de saida que puxe o dia mes e ano e informe se é antes ou depois de cristo, tentei ate fazer como visto abaixo, e o ano não pode passar de 10000 pode ver se estar correto?
class Diamesano{

        public int dia, mes, ano;

        public  Diamesano(int dia, int mes, int ano){

        if (!valido(dia, mes, ano)) { // se não válida, nem cria a instância, lança uma exceção para indicar que está errado

            throw new IllegalArgumentException("Valores inválidos");

        }

        this.dia = dia;

        this.mes = mes;

        this.ano = ano;

    }

         public boolean valido(int dia, int mes, int ano) {

    return 1 <= mes && mes <= 12 && 1 <= dia && dia <= ultimoDia(mes, ano);

}       public int getDia() {

        return dia;

    }

        public int getMes() {

        return mes;

    }

        public int getAno() {

        return ano;

    }

        private void limitar_ano(){

            if(ano > 10000) 

            {throw new IllegalArgumentException("Valor não permitido");

            }

        }

        public void setDia(int dia) {

        // valida o novo dia, usando o mês e ano que já tem

        if (!valido(dia, this.mes, this.ano)) {

            throw new IllegalArgumentException("Valores inválidos");

        }

        this.dia = dia;

    }

        public void setMes(int mes) {

        // valida o novo mês, usando o dia e ano que já tem

        if (!valido(this.dia, mes, this.ano)) {

            throw new IllegalArgumentException("Valores inválidos");

        }

        this.mes = mes;

    }

    public void setAno(int ano) {

        // valida o novo ano, usando o mês e dia que já tem

        if (!valido(this.dia, this.mes, ano)) {

            throw new IllegalArgumentException("Valores inválidos");

        }

        this.ano = ano;

    }

     // se o ano for bissexto

    private boolean bissexto(int ano) {

        return (ano % 4 == 0) && ((ano % 100) != 0 || (ano % 400) == 0);

     }

     // ver a quantidade de dias no mês  

    public int ultimoDia(int mes, int ano) {

    if (mes == 4 || mes == 6 || mes == 9 || mes == 11) {

        return 30;

    } else if (mes == 2) {

        return bissexto(ano) ? 29 : 28;

    }

    return 31;

}

    //somar umd dia

    public void somarUmDia() {

    this.dia++;

    if (this.dia > ultimoDia(this.mes, this.ano)) { // mudar para o mês seguinte

        this.mes++;

        this.dia = 1; // se mudar o mês, o próximo dia é 1

        if (this.mes > 12) { // mudou o ano

            this.mes = 1; // janeiro do ano seguinte

            this.ano++;

        }

    }

}  

    //somar dias

  public void somarDias(int qtdDias) {

    for (int i = 0; i < qtdDias; i++) {

        this.somarUmDia();

    }

}

  //subtrair dias

  public void subtrairUmDia() {

    this.dia--;

    if (this.dia == 0) { // mudar para o mês anterior

        this.mes--;

        if (this.mes == 0) { // mudar para o ano anterior

            this.ano--;

            this.mes = 12; // dezembro do ano anterior

        }

        this.dia = ultimoDia(this.mes, this.ano); // se mudou para o mês anterior, então deve ser o último dia deste

    }

    }

    public void subtrairDias(int qtdDias) {

    for (int i = 0; i < qtdDias; i++) {

        this.subtrairUmDia();

    }

 }

      //ver se o ano é antes ou dps de cristo

     public boolean antesdDeCristo(){

       return this.ano < 0;

     }

     public String getEra() {

     return this.ano < 0 ? "AC" : "DC";

     }

    }

}Texto pré-formatado

Cadê o fonte da classe com método main?

Se o ano tem um valor máximo, é só colocar isso na validação. E no toString, é só criar a string no formato que você quer:

public class DiaMesAno {
    ... construtor, getters, setters, etc

    private boolean valido(int dia, int mes, int ano) {
        // se ano é maior que 10000, data é inválida
        return ano <= 10000 && 1 <= mes && mes <= 12 && 1 <= dia && dia <= ultimoDia(mes, ano);
    }

    @Override
    public String toString() { // retorna no formato dd/mm/aaaa AC/DC
        return String.format("%02d/%02d/%04d %s", this.dia, this.mes, this.ano, this.getEra());
    }
}

O formato %02d imprime o número com 2 posições, completando com zero à esquerda caso necessário. Sugiro que estude a documentação para entender melhor como funcionam esses formatos.


Dentro do main não deu pra entender o que você fez, mas enfim: você tem que criar uma instância de DiaMesAno, e a partir dela você usa os getters. Assim:

public static void main(String[] args) {
    DiaMesAno d = new DiaMesAno(10, 8, 2020); // 10 de agosto de 2020
    System.out.println(d.getDia()); // 10
    System.out.println(d.getEra()); // DC
    System.out.println(d); // 10/08/2020 DC
}

Não quero parecer chato, mas parece que você está “apanhando” para entender o funcionamento básico da linguagem (o fato de ter que recorrer ao fórum a cada passo simples, além de não conseguir explicar direito o problema, já são fortes indícios disso). Então eu sugiro voltar alguns passos e rever o básico antes, senão vai continuar tendo dificuldades :wink:

2 curtidas

public class Testte1 {

preciso de ajuda novamente ESTA DANDO ERRO AQUI ME AJUDA non-static variable this cannot be referenced from a static context e me explica op ta dando esse erro

    public static void main(String[] args) {
    Diamesano d = new Diamesano(10, 8, 2020); // 10 de agosto de 2020
    System.out.println(d.getDia()); // 10
    System.out.println(d.getEra()); // DC
    System.out.println(d); // 10/08/2020 DC
            
        
    }
    class Diamesano{
        public int dia, mes, ano;
        public  Diamesano(int dia, int mes, int ano){
        if (!valido(dia, mes, ano)) { // se não válida, nem cria a instância, lança uma exceção para indicar que está errado
            throw new IllegalArgumentException("Valores inválidos");
        }
        this.dia = dia;
        this.mes = mes;
        this.ano = ano;
    }
         public boolean valido(int dia, int mes, int ano) {
    return ano <= 10000  && 1 <= mes && mes <= 12 && 1 <= dia && dia <= ultimoDia(mes, ano);
    
}       public int getDia() {
        return dia;
    }

        public int getMes() {
        return mes;
    }

        public int getAno() {
        return ano;
    }
       
        public void setDia(int dia) {
        // valida o novo dia, usando o mês e ano que já tem
        if (!valido(dia, this.mes, this.ano)) {
            throw new IllegalArgumentException("Valores inválidos");
        }
        this.dia = dia;
    }

        public void setMes(int mes) {
        // valida o novo mês, usando o dia e ano que já tem
        if (!valido(this.dia, mes, this.ano)) {
            throw new IllegalArgumentException("Valores inválidos");
        }
        this.mes = mes;
    }
    public void setAno(int ano) {
        // valida o novo ano, usando o mês e dia que já tem
        if (!valido(this.dia, this.mes, ano)) {
            throw new IllegalArgumentException("Valores inválidos");
        }
        this.ano = ano;
        
    }
     // se o ano for bissexto
    private boolean bissexto(int ano) {
        return (ano % 4 == 0) && ((ano % 100) != 0 || (ano % 400) == 0);
     }
     // ver a quantidade de dias no mês  
     
    public int ultimoDia(int mes, int ano) {
    if (mes == 4 || mes == 6 || mes == 9 || mes == 11) {
        return 30;
    } else if (mes == 2) {
        return bissexto(ano) ? 29 : 28;
    }
    return 31;
}
    //somar umd dia
    public void somarUmDia() {
    this.dia++;
    if (this.dia > ultimoDia(this.mes, this.ano)) { // mudar para o mês seguinte
        this.mes++;
        this.dia = 1; // se mudar o mês, o próximo dia é 1
        if (this.mes > 12) { // mudou o ano
            this.mes = 1; // janeiro do ano seguinte
            this.ano++;
        }
    }
}  
    //somar dias
  public void somarDias(int qtdDias) {
    for (int i = 0; i < qtdDias; i++) {
        this.somarUmDia();
    }
}
  //subtrair dias
  public void subtrairUmDia() {
    this.dia--;
    if (this.dia == 0) { // mudar para o mês anterior
        this.mes--;
        if (this.mes == 0) { // mudar para o ano anterior
            this.ano--;
            this.mes = 12; // dezembro do ano anterior
        }
        this.dia = ultimoDia(this.mes, this.ano); // se mudou para o mês anterior, então deve ser o último dia deste
    }
    }
    public void subtrairDias(int qtdDias) {
    for (int i = 0; i < qtdDias; i++) {
        this.subtrairUmDia();
    }
    
 }
      //ver se o ano é antes ou dps de cristo
     public boolean antesdDeCristo(){
       return this.ano < 0;
     }
     public String getEra() {
     return this.ano < 0 ? "AC" : "DC";
     }
     
@Override
    public String toString() { // retorna no formato dd/mm/aaaa AC/DC
        return String.format("%02d/%02d/%04d %s", this.dia, this.mes, this.ano, this.getEra());
    }
}
    }

eu pondo minha class diamesano estatica é correto?

“Correto” é relativo, pois depende do que você precisa. Definir uma classe dentro de outra (inner class ou nested class) é um tópico um pouco mais avançado (e se quiser, tem esse tutorial que pode ajudar - mas acho que só vai ajudar depois que você dominar o básico).

Então, como eu já disse, eu recomendo voltar alguns passos e revisar o básico.

Por exemplo, criar a classe Diamesano em outro arquivo chamado Diamesano.java e deixar essa classe public, assim você consegue acessá-la na classe Teste1.

Depois que você entender muito bem como funcionam as classes, a diferença entre classe e instância, etc, aí você parte para inner classes. Não pule etapas.