Java - Validar fecha para usuario

 
Vista:
Imágen de perfil de Puka
Val: 25
Ha aumentado su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

Validar fecha para usuario

Publicado por Puka (8 intervenciones) el 11/08/2020 22:10:47
buenas tengo este inconveniente
si el usuario ingresa la fecha de manera errónea no existe la validación correspondiente,

1
2
3
4
5
6
7
8
9
private void cargarFechaVenta() {
 
 
    Calendar miCalendar = Calendar.getInstance();
 
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    txtFecha.setText(String.valueOf(dateFormat.format(miCalendar.getTime())));
 
}

deberia agregar algo mas para que a el usaurio le salte una ventana de incorecto?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 2.717
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Validar fecha para usuario

Publicado por Kabuto (706 intervenciones) el 12/08/2020 02:51:08
Ese método no recoge ningún dato, si no que lo publica en un campo de texto.

Si quieres validar una fecha tipo YYYY-MM-DD, puedes usar expresiones regulares o escribir tu propio código donde se puede ser más explicito informando si lo que falla es el año, o el mes o el día.

Puedes recoger el String y dividirlo con el método split(), indicando que haga la división allá donde encuentre el guion "-".

Este método te devuelve un array, que ha de ser de tres elementos. Si el array a devolver tiene más o menos de tres elementos, la fecha ya se puede dar por incorrecta.

Se supone que el elemento [0] del array estará el año, en el [1] el mes y en el [2] el día.
Una vez dividida, puedes evaluar cada parte por separado, usando métodos para cada parte.


Por ejemplo el día ha de ser un String de dos carácteres, se ha de poder parsear a Integer (es decir, se ha introducido realmente un número y no letras o símbolos) y una vez parseado, ha de ser un valor entero entre 1 y 31.
Con mes y año se harán comprobaciones similares.

Respecto al año, las condiciones para darlo por bueno ya depende de si se aceptan fechas antiguas de siglos pasados y/o fechas del futuro, es decir superiores al año actual.
Lo que nunca será admisible es el valor entero 0, porque no existe el año 0.

Abajo pongo un código simple, de una campo y un botón para validar la fecha según he explicado.
Solo se comprueba el formato YYYY-MM-DD
No se tiene en cuenta comprobaciones más profundas, por ejemplo si es Febrero solo aceptar del 1 al 28 como día, o hasta 29 si es año bisiesto.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
public class ValidarFecha extends JFrame{
 
	private JTextField campoFecha;
	private JButton btValidar;
 
	public ValidarFecha() {
 
		campoFecha = new JTextField(10);
		btValidar = new JButton("Validar");
		btValidar.addActionListener(new AccionValidarFecha());
 
		JPanel campo = new JPanel();
		campo.setBorder(new EmptyBorder(20, 80, 20, 80));
		campo.add(campoFecha);
 
		JPanel boton = new JPanel();
		boton.add(btValidar);
 
		setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
		add(campo);
		add(boton);
 
		setTitle("Validar Fecha");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		pack();
		setLocationRelativeTo(null);
		setVisible(true);
 
	}
 
	private class AccionValidarFecha implements ActionListener {
		@Override
		public void actionPerformed(ActionEvent e) {
			String fecha = campoFecha.getText();
			if (fecha.isBlank())
				JOptionPane.showMessageDialog(null, "Campo vacío");
			else {
				String[] partesFecha = fecha.split("-");
				//Comprobamos si tenemos tres partes
				if (partesFecha.length == 3) {
					if (!validarAnio(partesFecha[0]))
						JOptionPane.showMessageDialog(null, "El AÑO no es correcto");
					else if (!validarMes(partesFecha[1]))
						JOptionPane.showMessageDialog(null, "El MES no es correcto");
					else if (!validarDia(partesFecha[2]))
						JOptionPane.showMessageDialog(null, "El DIA no es correcto");
					else
						JOptionPane.showMessageDialog(null, "Formato de fecha parece correcto");
 
				}
				else
					JOptionPane.showMessageDialog(null, "Formato incorrecto");
 
			}
 
		}
	}
 
	private boolean validarDia(String dia) {
		if (dia.length() != 2) //Comprobamos que son dos caracteres
			return false;
		else { //Y que es un valor numérico, entre 0 y 31
			try {
				int dd = Integer.parseInt(dia);
				return (dd > 0 && dd < 31);
			}
			catch(NumberFormatException e) {
				return false; //No se ha tecleado un valor numérico
			}
		}
	}
 
	private boolean validarMes(String mes) {
		if (mes.length() != 2)
			return false;
		else {
			try {
				int mm = Integer.parseInt(mes);
				return (mm > 0 && mm < 13);
			}catch(NumberFormatException e) {
				return false;
			}
		}
 
	}
 
	private boolean validarAnio(String anio) {
		if (anio.length() != 4)
			return false;
		else {
			try {
				int aaaa = Integer.parseInt(anio);
				return (aaaa != 0); //Aquí depende de que fechas queremos aceptar
			} catch(NumberFormatException e) {
				return false;
			}
		}
	}
 
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				new ValidarFecha();
			}
		});
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Puka
Val: 25
Ha aumentado su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

Validar fecha para usuario

Publicado por Puka (8 intervenciones) el 12/08/2020 02:55:35
hola gracias por la explicaion por ejemplo yo estoy trabajando con este metodo que es adonde tengo el error:


vos me recomendas que siga con tu codigo ? o me conviene llamar a un metodo para el campo de fecha . cuando el usario ponga la fecha pueda saltar el error si inserta mla el formato .?

mi cod es este.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void cargarFechaVenta() {
 
 
    Calendar miCalendar = Calendar.getInstance();
 
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    txtFecha.setText(String.valueOf(dateFormat.format(miCalendar.getTime())));
 
   if (dateFormat) {
       JOptionPane.showMessageDialog(null , "Debe ingresar formato valido.", "yyy-MM-dd", JOptionPane.ERROR_MESSAGE );
 
   } else {
 
   }
 
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 2.717
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Validar fecha para usuario

Publicado por Kabuto (706 intervenciones) el 13/08/2020 02:30:44
Insisto, en tu código no veo que se recoja nada insertado por el usuario.

Por otro lado, la clase Calendar se considera "medio obsoleta", por no decir obsoleta del todo.

Mucho mejor usar la clase LocalDate.
Entre su métodos, existe uno que a partir de un String e indicándole que formato deseamos, creará un objeto LocalDate con el que poder trabajar.
Si el String proporcionado no tiene el formato que queremos, entonces se produce una excepción que podemos capturar e informar al usuario de que el formato no es bueno.

Pongo otro código más sencillo, en modo consola, donde se pide una fecha por teclado y se intenta construir un LocalDate.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Scanner;
 
public class EjemploLocalDate {
 
	public static void main(String[] args) {
 
		Scanner teclado = new Scanner(System.in);
		System.out.print("Ingrese fecha (yyyy-mm-dd): ");
		String entrada = teclado.nextLine();
 
		try {
			LocalDate fecha = LocalDate.parse(entrada, DateTimeFormatter.ISO_LOCAL_DATE);
			System.out.println("Fecha correcta!!");
			System.out.println("Dia: " + fecha.getDayOfMonth());
			System.out.println("Mes: " + fecha.getMonthValue());
			System.out.println("Año: " + fecha.getYear());
		} catch(DateTimeParseException ex) {
			System.out.println("ERROR. No se pudo crear FECHA con esa entrada.");
		}
 
		teclado.close();
	}
 
}

Si le damos una fecha con formato por ejemplo: dd-mm-yyyy. Se producirá excepción.

1
2
Ingrese fecha (yyyy-mm-dd): 13-08-2020
ERROR. No se pudo crear FECHA con esa entrada.
Si lo hacemos en el formato correcto, tendremos un objeto LocalDate con el que poder trabajar:
1
2
3
4
5
Ingrese fecha (yyyy-mm-dd): 2020-08-13
Fecha correcta!!
Dia: 13
Mes: 8
Año: 2020

¿Cómo sabe el método LocalDate.parse() que quiero el formato yyyy-mm-dd?
Se lo hago saber con la constante: DateTimeFormatter.ISO_LOCAL_DATE

1
LocalDate fecha = LocalDate.parse(entrada, DateTimeFormatter.ISO_LOCAL_DATE);

Si miramos la documentación de Oracle para DateTimeFormatter vemos los formatos predefinidos y explicaciones para establecer otros formatos distintos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Puka
Val: 25
Ha aumentado su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

Validar fecha para usuario

Publicado por Puka (8 intervenciones) el 14/08/2020 02:02:23
Mucgas gracias por la informacion eh tomado puntes y leido lo que me dejaste quizas sea mejor seguir tu consejo :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Puka
Val: 25
Ha aumentado su posición en 3 puestos en Java (en relación al último mes)
Gráfica de Java

Validar fecha para usuario

Publicado por Puka (8 intervenciones) el 19/08/2020 17:30:08
hola y como puedo llamar a mi clase para mostrarla en un jframe en un campo de txtFecha que: doy agregar y tengo que rellenar datos ? para que el usario sea avisado si pone mal el formato. ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kabuto
Val: 2.717
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Validar fecha para usuario

Publicado por Kabuto (706 intervenciones) el 20/08/2020 01:10:40
En mi primera respuesta puse un ejemplo de un programa con JFrame.

Ahí puedes ver que el código que valida la fecha, va en la clase ActionListener que uso para el botón "Validar".

Si también vas a usar un botón, pues es ahí, en su ActionListener donde has de utilizar tu clase para validar la fecha.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar