Alguém pode me ajudar? (datas)

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

Como você tentou fazer?

1 curtida

Ainda não conseguir fazer. Não sei por onde começar. @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:

1 curtida

@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:

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

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

1 curtida

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

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?

1 curtida
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();
}

}
1 curtida

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.

1 curtida

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.

1 curtida

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();
}

}

@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.

1 curtida

@Fefo80

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

1 curtida

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");
    }
}
1 curtida

@Fefo80 boa noite, não conseguir fazer.

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

@Halsey tentou o que o Hugo mostrou acima?

Boa noite. E aí, deu certo?