Come inserire data valida in Java

di il
8 risposte

Come inserire data valida in Java

Ho un problema , praticamente qualsiasi data inserisco il software mi riscrive la data, se ci sono errori non vengono rilevati, potete aiutarmi gentilmente.
Qui sotto c'è l'esercizio da fare, e successivamente la mia compilazione in linguaggio Java.

Esercizio:

Scrivere un programma che legga una stringa dalia tastiera e che verifichi se questa contiene una data valida. Si mostri la data e un messaggio che indica se questa è valida. Se non è valida si mostri inoltre un messaggio che ne spieghi il morivo. La data in input deve avere il formato gg/mm/aaaa. Un valore valido per il mese mm deve essere compreso tra 1 e 12 (Gennaio è 1), Un valore valido per il giorno gg deve essere incluso tra 1 e un valore corretto per quel ?nese. Si dev'e quindi tenere in considerazione il fatto che Aprile, Giugno, Settembre e Novembre hanno 30 giorni, mentre Febbraio ne ha 28. Si consideri inoltre reffetto degli anni bisestili, che sono tutti quelli divisibili per 4, ma non divisibili per 100 a meno che non siano dnnsibiii per 400.




package it.programmadiprova;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;

public class Classe4 {

public static void provaCalendario() throws ParseException {

System.out.println("Scrivere data calendario in formato [dd/mm/yyyy]");

Scanner tastiera = new Scanner(System.in);

String testo;

testo = tastiera.next();

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");;
Date miaData = sdf.parse(testo);

Calendar calendario = Calendar.getInstance();

calendario.setTime(miaData);

int anno = calendario.get(Calendar.YEAR);
int mese = calendario.get(Calendar.MONTH)+1;
int giorno = calendario.get(Calendar.DAY_OF_MONTH);


boolean bisestile = anno%400==0 || anno%4==0 && anno%100!=0;


if(giorno<=28 && mese==2 && anno>0) {
System.out.println(testo + " Data valida");

} else if(giorno==29 && mese==2 && bisestile) {
System.out.println(testo + " Anno bisestile");

} else if(giorno<=30 && anno>0 && mese==4 || mese==6 || mese==9 || mese==11) {
System.out.println(testo + " Data valida");

} else if(giorno<=31 && anno>0 && mese==1 || mese==3 || mese==5 || mese==7 || mese==8 || mese==10 || mese==12) {
System.out.println(testo + " Data valida");

} else

System.out.println( "Data non valida");


}
}

8 Risposte

  • Re: Come inserire data valida in Java

    fabrizio95 ha scritto:


    Ho un problema , praticamente qualsiasi data inserisco il software mi riscrive la data, se ci sono errori non vengono rilevati, potete aiutarmi gentilmente.
    Innanzitutto quei if final (gli ultimi due sono pure sbagliati, perché && ha priorità maggiore rispetto a || ) di per sé non servono.
    Con i (Simple)DateFormat un conto è una data "ben formata" (secondo un certo pattern) e un altro conto è una data che "esiste".

    Quando crei il SimpleDateFormat, per default è in modalità lenient ("indulgente"). Rifiuta date malformate ma accetta date che non esistono. Se tu inserisci 31/06/2020 (che non "esiste") questa viene ACCETTATA ma la considera come "1 giorno dopo la fine di Giugno" e ti ritrovi nell'oggetto Date 01/07/2020.

    Se non vuoi questa "indulgenza", basta fare prima del parse:
    sdf.setLenient(false);
    E quindi NON accetterà mai date come 29/02/2019 o 31/06/2020 ecc... lanciando un bel ParseException (che tu dovresti catturare e gestire).

    Pertanto rivedi il codice alla luce di queste informazioni e riverifica i test che fai.
  • Re: Come inserire data valida in Java

    Scusami, come faccio a scrivere 2 messaggi di errore?
    Uno nel caso si scive una data che non esiste,
    esempio: 31/06/2020, in output dovrebbe uscire "Data inserita non valida".
    L'altro messaggio è riferito ad un anno che non è bisestile,
    esempio: 29/02/2019, in output dovrebbe uscire "l'anno inserito non è bisestile".


    Adesso ho fatto così ma posso scrivere solo un messaggio di errore.

    package it.programmadiprova;

    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.Scanner;

    public class Classe4 {

    public static void provaCalendario() throws ParseException {

    System.out.println("Scrivere data calendario in formato [dd/mm/yyyy]");

    Scanner tastiera = new Scanner(System.in);

    String testo;

    testo = tastiera.next();

    try {

    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");;
    sdf.setLenient(false);
    Date miaData = sdf.parse(testo);

    Calendar calendario = Calendar.getInstance();

    calendario.setTime(miaData);

    int anno = calendario.get(Calendar.YEAR);
    int mese = calendario.get(Calendar.MONTH)+1;
    int giorno = calendario.get(Calendar.DAY_OF_MONTH);

    boolean bisestile = anno%400==0 || anno%4==0 && anno%100!=0;

    if(bisestile) {
    System.out.println(testo + " L'anno è bisestile");

    } else
    System.out.println(testo + " Data valida");

    } catch (Exception e) {

    System.out.println("Data inserita non valida");

    }

    }
    }
  • Re: Come inserire data valida in Java

    fabrizio95 ha scritto:


    Scusami, come faccio a scrivere 2 messaggi di errore?

    Adesso ho fatto così ma posso scrivere solo un messaggio di errore.
    Quindi cosa vorresti scrivere? Il codice che hai scritto, come "flusso" e stampa dei messaggi, mi pare corretto e logico.
  • Re: Come inserire data valida in Java

    Il codice funziona però io vorrei inserire 2 eccezzioni,
    in catch , c'è solo l' eccezione System.out.println("Data inserita non valida");

    Se chi usa il software dovesse scrivere : 29/02 cioè il 29 febbraio di un anno NON bisestile, vorrei che apparisse l'errore:
    System.out.println("L'anno non è bisestile");
  • Re: Come inserire data valida in Java

    fabrizio95 ha scritto:


    Se chi usa il software dovesse scrivere : 29/02 cioè il 29 febbraio di un anno NON bisestile, vorrei che apparisse l'errore:
    System.out.println("L'anno non è bisestile");
    Con il lenient=false non si può perché es. un 29/02/2019 è una data che NON ESISTE e il parse() non te la converte in Date ma ti lancia ParseException. E quindi non avrebbe molto senso dire "non è bisestile" .... non esiste!!

    EDIT: so già cosa stai pensando: "lascio il lenient a true default". NO. Perché 29/02/2019 viene trattato e parsato come 01/03/2019 !!!
  • Re: Come inserire data valida in Java

    Quindi non si possono lanciare più messaggi di errori?
  • Re: Come inserire data valida in Java

    fabrizio95 ha scritto:


    Quindi non si possono lanciare più messaggi di errori?
    Ho aggiunto un edit al post precedente che non hai letto.
  • Re: Come inserire data valida in Java

    Va bene grazie Andrea.
Devi accedere o registrarti per scrivere nel forum
8 risposte