Alguém pode me ajudar? (datas)

17 respostas
java
Halsey

Gente, estou com dificuldade no desenvolvimento desde código em Java. Alguém poderia me ajudar, por favor.

17 Respostas

Fefo80

Como você tentou fazer?

Halsey

Ainda não conseguir fazer. Não sei por onde começar. @Fefo80

Fefo80

Crie uma string dataDigitada e pegue o que o usuário digitar.

Depois mostre na tela uma pergunta “qual formato de saída desejado?”

Pegue a resposta e jogue no switch.

Para pegar o formato desejado, é só usar a função substring na string dataDigitada.

Tenta aí e posta aqui o resultado.
:wink:

Halsey

@Fefo80
Esse é meu primeiro semestre e já estou arrependida de ter entrado no curso. Além disso, as aulas são online, ai que eu não entendo mesmo, e pra trocar de curso tenho que cursar esse semestre. De verdade, não sei por onde começar. :pensive:

Fefo80

Vamos começar pelo básico: o que você sabe?

Vamos construir a partir do que você sabe, fique tranquilo.

Halsey
import java.util.*;

public class MinhaData

{

private String nome;

private Data dataDelancamento;
public void setLancamento (Date data)

{

this.lancamento = data;

}

SimpleDateFormat formato = new Simple

DateFormat (dd/mm/yyyy);

Date data = formato.parse(23/11/2020);System.out.println(formato.format(data));

}

Comecei assim, mas não sei se é. @Fefo80

Fefo80

Existem várias formas de fazer. Vou postar abaixo uma, e você tenta completar o código, combinado?

E depois tente fazer com essa forma do SimpleDateFormat etc.

Ok?

Fefo80
import java.util.Scanner;

public class MinhaData {

public static void main(String[] args) {

	Scanner entrada = new Scanner(System.in);
	String data;
	
	do {
	System.out.print("Digite a data, no formato dd/mm/aaaa: ");
	data = entrada.nextLine();
	
	if (data.length() != 10) {
		System.out.println("\n\nData digitada no formato errado! Tente de novo\n\n");
	}
	} while (data.length() != 10);

	System.out.println("\nEscolha o formato de saída!");
	System.out.println("Para DD/MM/AA digite 1");
	System.out.println("Para MM/AAAA digite 2");
	System.out.println("MM/DD/AAAA");
	System.out.println("E para DD/MES_POR_EXTENSO/AAAA digite 4");
	System.out.print("\nQual sua escolha? ");
	
	int escolha = Integer.parseInt(entrada.nextLine());
	
	while (escolha < 1 && escolha > 4) {
		System.out.println("\nValor inválido, tente novamente!\n");

		System.out.println("Escolha o formato de saída:");
		System.out.println("Para DD/MM/AA digite 1");
		System.out.println("Para MM/AAAA digite 2");
		System.out.println("MM/DD/AAAA");
		System.out.println("E para DD/MES_POR_EXTENSO/AAAA digite 4");
		System.out.print("\nQual sua escolha? ");
		
		escolha = Integer.parseInt(entrada.nextLine());
	}
	
	switch (escolha) {
	case 1:
		System.out.print("\nResultado: " + data.substring(0, 2) + "/" + data.substring(3, 5) + "/" + data.substring(8, 10) + "\n");
		break;
	case 2:
		break;
	case 3:
		break;
	case 4:
		break;
	default:
		break;
	}	

	entrada.close();
}

}
Halsey

Ok @Fefo80 Muito obrigado, me ajudou muito com seus conhecimentos, quem entende é outro nivel. :hugs::hugs::hugs::hugs:

Muito Obrigado mesmo, vou tentar fazer de outra forma, pode deixar.

Fefo80

Depois posta aí como ficou.

Seja bem vinda ao fórum! Um lugar de conhecimento e interação, com pessoas sempre com a intenção de ajudar quem está disposto.

E, quando for mais experiente, por favor sinta-se convidada a retornar ao fórum para ajudar aos novatos.

Halsey

Oi, @Fefo80 bom dia.

Eu estava tentando modificar o código, porém não conseguir muito. Como eu disse estou iniciando e estou com algumas dificuldades.

Na opção de selecionar um formato, apenas o 1 rodava, modifiquei e conseguir fazer o 2 funcionar, porem não conseguir mais, dava erros constantes. Na escolha 4, o resultado sai: 10/Wed Mar 24 + as horas + GMT-03 2021/20.
Tem que ficar 31/outubro/2020

Eu modifiquei a parte do switch. Porem começa a da erros tbm.

import java.util.Scanner;
import java.util.Calendar;

public class MinhaData {

public static void main(String[] args) {

Scanner entrada = new Scanner(System.in);
String data;

do {

System.out.print("Digite a data, no formato DD/MM/AAAA: ");

data = entrada.nextLine();
if (data.length() != 10) {

System.out.println("\n\nData digitada no formato errado! Tente de novo\n\n");

}

} while (data.length() != 10);
System.out.println("\nEscolha o formato de saída:");

System.out.println(Para DD/MM/AA, digite 1);

System.out.println(Para MM/AAAA, digite 2);

System.out.println(Para MM/DD/AAAA, digite 3);

System.out.println(E para DD/MES_POR_EXTENSO/AAAA, digite 4);

System.out.print("\nQual sua escolha? ");

int escolha = Integer.parseInt(entrada.nextLine());

while (escolha < 1 && escolha > 4) {
System.out.println("\nValor inválido, tente novamente!\n");

System.out.println(Escolha o formato de saída:);

System.out.println(Para DD/MM/AA, digite 1);

System.out.println(Para MM/AAAA, digite 2);

System.out.println(MM/DD/AAAA, digite 3);

System.out.println(E para DD/MES_POR_EXTENSO/AAAA, digite 4);

System.out.print("\nQual sua escolha? ");

escolha = Integer.parseInt(entrada.nextLine());
}

switch (escolha) {

case 1:

System.out.print("\nResultado: " + data.substring(0, 2) + “/” + data.substring(3, 5) + “/” + data.substring(8, 10) + “\n”);

break;

case 2:

System.out.print("\nResultado: " + data.substring(0, 2) + “/” + data.substring(8, 10) + “\n”);

break;

case 3:

System.out.print("\nResultado: " + data.substring(3, 5) + “/” + data.substring(0, 2) + “/” + data.substring(8, 10) + “\n”);

break;

case 4:

System.out.print("\nResultado: " + data.substring(0, 2) + / + data.substring(0, 2) + / + data.substring(8, 10) + “\n);

break;

default:

break;

}

entrada.close();
}

}

Fefo80

@Halsey qual erro que deu?

Ah… lembra sempre de formatar teu código, quando postar aqui.

Olhando a documentação da classe Calendar que você chamou - https://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html - veremos que ela pode exportar nos seguintes formatos:

For the date fields:

YEAR + MONTH + DAY_OF_MONTH
 YEAR + MONTH + WEEK_OF_MONTH + DAY_OF_WEEK
 YEAR + MONTH + DAY_OF_WEEK_IN_MONTH + DAY_OF_WEEK
 YEAR + DAY_OF_YEAR
 YEAR + DAY_OF_WEEK + WEEK_OF_YEAR

For the time of day fields:

HOUR_OF_DAY
 AM_PM + HOUR

Se quiser ler um pouco mais sobre o Calendar, olha aqui: https://www.javatpoint.com/java-util-calendar

No Devmedia explica como você pode jogar em português: https://www.devmedia.com.br/trabalhando-com-as-classes-date-calendar-e-simpledateformat-em-java/27401

Um plano B, se você não conseguir fazer com os links acima, você pode fazer com SWITCH ou com IF, testando o mês e colocando o nome. Não é a melhor forma, mas funciona.

Se não conseguir fazer, me avisa.

Halsey

@Fefo80

Vou ler esses links e tentar fazer de novo.
Qualquer coisa eu volto aqui e lhe aviso se conseguir.

hugokotsubo

Se a ideia é validar datas, não use substring, pois aí você só estará pegando pedaços da string, sem saber se de fato foi digitado uma data.

Por exemplo, se eu digitar abcdefghij, e depois escolher a opção 3, o resultado foi de/ab/ij.

Você tinha usado SimpleDateFormat (que eu só recomendaria se estiver usando Java <= 7, pois a partir do Java 8 tem um jeito melhor), então estava no caminho certo. De qualquer forma, segue abaixo soluções com ambas.

A ideia é usar um formatador/parser para validar a entrada, e outro para formatar a saída.

Para Java >= 8, prefira usar a API java.time. No caso, como a data só tem dia, mês e ano, a melhor opção é a classe java.time.LocalDate:

Scanner entrada = new Scanner(System.in);
DateTimeFormatter formatoEntrada = DateTimeFormatter.ofPattern("dd/MM/uuuu").withResolverStyle(ResolverStyle.STRICT);
LocalDate data;
while (true) {
    System.out.print("Digite a data, no formato DD/MM/AAAA: ");
    try {
        data = LocalDate.parse(entrada.nextLine(), formatoEntrada);
        break; // se a data for válida, sai do while
    } catch (DateTimeParseException e) {
        System.out.println("Data no formato inválido, deve ser DD/MM/AAAA");
    }
}

// formatos válidos
List<DateTimeFormatter> formatos = new ArrayList<>();
formatos.add(DateTimeFormatter.ofPattern("dd/MM/uu"));
formatos.add(DateTimeFormatter.ofPattern("MM/uuuu"));
formatos.add(DateTimeFormatter.ofPattern("MM/dd/uuuu"));
formatos.add(DateTimeFormatter.ofPattern("dd/MMMM/uuuu", new Locale("pt", "BR")));

int escolha;
while (true) {
    System.out.println("Escolha o formato de saída:");
    System.out.println("Para DD/MM/AA, digite 1");
    System.out.println("Para MM/AAAA, digite 2");
    System.out.println("MM/DD/AAAA, digite 3");
    System.out.println("E para DD/MES_POR_EXTENSO/AAAA, digite 4");
    System.out.print("\nQual sua escolha? ");

    try {
        escolha = Integer.parseInt(entrada.nextLine());
        if (1 <= escolha && escolha <= 4) {
            DateTimeFormatter formatoSaida = formatos.get(escolha - 1);
            System.out.println(formatoSaida.format(data));
            break; // sai do while
        } else {
            System.out.println("Formato inválido");
        }
    } catch (NumberFormatException e) {
        System.out.println("Você não digitou um número");
    }
}

// não precisa fechar o System.in

Usei o ResolverStyle.STRICT porque assim ele não deixa digitar datas como 31 de fevereiro (sem isso, esta data seria ajustada para dia 28).

Para o nome do mês usei o Locale correspondente ao português do Brasil, assim o DateTimeFormatter já pega os nomes corretos.


Para código novo com as versões mais recentes da linguagem (na verdade qualquer uma acima do Java 8), eu recomendo aprender o java.time, que é a API mais moderna e que corrige vários problemas de Date, Calendar e SimpleDateFormat.

Mas se estiver usando Java <= 7, pode fazer assim:

Scanner entrada = new Scanner(System.in);
SimpleDateFormat formatoEntrada = new SimpleDateFormat("dd/MM/yyyy");
formatoEntrada.setLenient(false); // para não aceitar datas inválidas
Date data;
while (true) {
    System.out.print("Digite a data, no formato DD/MM/AAAA: ");
    try {
        data = formatoEntrada.parse(entrada.nextLine());
        break; // se a data for válida, sai do while
    } catch (ParseException e) {
        e.printStackTrace();
        System.out.println("Data no formato inválido, deve ser DD/MM/AAAA" );
    }
}

// formatos válidos
List<SimpleDateFormat> formatos = new ArrayList<>();
formatos.add(new SimpleDateFormat("dd/MM/yy"));
formatos.add(new SimpleDateFormat("MM/yyyy"));
formatos.add(new SimpleDateFormat("MM/dd/yyyy"));
formatos.add(new SimpleDateFormat("dd/MMMM/yyyy", new Locale("pt", "BR")));

int escolha;
while (true) {
    System.out.println("Escolha o formato de saída:");
    System.out.println("Para DD/MM/AA, digite 1");
    System.out.println("Para MM/AAAA, digite 2");
    System.out.println("MM/DD/AAAA, digite 3");
    System.out.println("E para DD/MES_POR_EXTENSO/AAAA, digite 4");
    System.out.print("\nQual sua escolha? ");

    try {
        escolha = Integer.parseInt(entrada.nextLine());
        if (1 <= escolha && escolha <= 4) {
            SimpleDateFormat formatoSaida = formatos.get(escolha - 1);
            System.out.println(formatoSaida.format(data));
            break; // sai do while
        } else {
            System.out.println("Formato inválido");
        }
    } catch (NumberFormatException e) {
        System.out.println("Você não digitou um número");
    }
}
Halsey

@Fefo80 boa noite, não conseguir fazer.

Tentei modificar pra rodar todas as opções de uma vez, e não conseguir tbm.

Fefo80

@Halsey tentou o que o Hugo mostrou acima?

Fefo80

Boa noite. E aí, deu certo?

Criado 22 de março de 2021
Ultima resposta 18 de abr. de 2021
Respostas 17
Participantes 3