Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di Girvy
    Registrato dal
    May 2007
    Messaggi
    43

    CalendarIsValid

    Salve a tutti ho un problema ho una funzione che prende come parametro in input un Object target sotto forma di array di 3 interi anno,mese,data ed io devo verificare che che target[0] (cioè l'anno sia inserito correttamente) ed anche mese e data
    Immagino di dover utilizzare la classe Calendar o GregorianCalendar per validare l'anno ma non ho idea di quale funzione utilizzare per validare l'anno dal 1970 in poi......Per favore aiutatemi!!!! VVoVe:

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Se si hanno 3 valori interi che contengono giorno/mese/anno (quindi nessuna stringa da "parsare"), validare la data è abbastanza semplice: si crea un GregorianCalendar con i 3 dati, si imposta il calendar in modo che non sia "lenient" e si prova a fare un get di un campo. Se i dati non sono corretti, viene lanciata la eccezione IllegalArgumentException.

    Esempio:

    codice:
    import java.util.*;
    
    public class Prova
    {
        public static void main (String[] args)
        {
            System.out.println (isDateValid (29, 2, 2007));     // false
            System.out.println (isDateValid (31, 11, 2007));    // false
            System.out.println (isDateValid (31, 12, 2007));    // true
            System.out.println (isDateValid (31, 13, 2007));    // false
            System.out.println (isDateValid (29, 2, 2008));     // true
        }
    
        public static boolean isDateValid (int day, int month, int year)
        {
            GregorianCalendar cal = new GregorianCalendar (year, month-1, day);
            cal.setLenient (false);
    
            try {
                cal.get (Calendar.DATE);
                return true;
            } catch (IllegalArgumentException e) {
                return false;
            }
        }
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di Girvy
    Registrato dal
    May 2007
    Messaggi
    43
    Il problema è che la mia funzione è questa:
    public boolean validate(Object target){
    }
    deve restituire tru se la verifica è effettuata correttamente false altrimenti

    ed la relativa javadoc èer aiutare è:

    @param target An array of 3 integers representing the {year, month, date} to validate. @return boolean <code>true</code> if the date is valid, <code>false</code> otherwise

    Spero adesso si capisca di più..non so come fare..

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,317
    Mi pare che andbin ti abbia aiutato fin troppo: ti ha postato il codice completo della funzione... basta che tu lo adatti alle tue esigenze: non credo che sia una cosa così complicata, visto che al posto di avere 3 interi distinti hai un Object che rappresenta un array di 3 interi...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Girvy
    Il problema è che la mia funzione è questa:
    public boolean validate(Object target){
    }
    deve restituire tru se la verifica è effettuata correttamente false altrimenti

    ed la relativa javadoc èer aiutare è:

    @param target An array of 3 integers representing the {year, month, date} to validate. @return boolean <code>true</code> if the date is valid, <code>false</code> otherwise

    Spero adesso si capisca di più..non so come fare..
    Allora fai un cast così:

    codice:
    public boolean validate(Object target){
        int[] data = (int[]) target;
    
        // qui usi data[0], data[1], data[2]
    ....
    È chiaro che facendo così un cast senza alcun altro test, a questo metodo validate deve essere passato un array di int, e per essere più precisi, contenente almeno 3 int.

    Non so dire io (forse ... spero ... lo saprai tu) il perché questo metodo ha come parametro un Object, che è quindi una cosa molto generica. Forse perché deve accettare diversi tipi di dati??
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it L'avatar di Girvy
    Registrato dal
    May 2007
    Messaggi
    43
    Grazie mille andbin...sei stato gentilissimo

  7. #7
    Originariamente inviato da andbin
    Se si hanno 3 valori interi che contengono giorno/mese/anno (quindi nessuna stringa da "parsare"), validare la data è abbastanza semplice: si crea un GregorianCalendar con i 3 dati, si imposta il calendar in modo che non sia "lenient" e si prova a fare un get di un campo. Se i dati non sono corretti, viene lanciata la eccezione IllegalArgumentException.

    Esempio:

    codice:
    import java.util.*;
    
    public class Prova
    {
        public static void main (String[] args)
        {
            System.out.println (isDateValid (29, 2, 2007));     // false
            System.out.println (isDateValid (31, 11, 2007));    // false
            System.out.println (isDateValid (31, 12, 2007));    // true
            System.out.println (isDateValid (31, 13, 2007));    // false
            System.out.println (isDateValid (29, 2, 2008));     // true
        }
    
        public static boolean isDateValid (int day, int month, int year)
        {
            GregorianCalendar cal = new GregorianCalendar (year, month-1, day);
            cal.setLenient (false);
    
            try {
                cal.get (Calendar.DATE);
                return true;
            } catch (IllegalArgumentException e) {
                return false;
            }
        }
    }
    Riapro il topic per sottoporvi un problema. Ho trovato molto utile questa funzione per un progetto a cui sto lavorando e l'ho lievemente modificata in modo da adattarla meglio alle mie esigenze. In parole povere, anziché passare tre interi, passo una stringa che rappresenta la data, effettuo il parsing attraverso un metodo ausiliario, dopodiché il metodo è lo stesso che ha postato andbin. Ecco quello che ho fatto.

    codice:
    import java.util.*;
    public class Test {
    	public static GregorianCalendar parseDate(String date) {
    		int[] parsed = new int[3];
    		int j = 0;
    		String token = "";
    		for (int i = 0; i < date.length(); i++) {
    			if (date.charAt(i) != '/')
    				token += date.charAt(i);
    			else {
    				parsed[j++] = Integer.parseInt(token);
    		        token = "";
    			}
    		}
    		return new GregorianCalendar(parsed[2], parsed[1] - 1, parsed[0]);
    	}
    
    	public static boolean isValidDate(String date) {
            GregorianCalendar check = parseDate(date);
            check.setLenient(false);
            try {
                check.get(Calendar.DATE);
                return true;
            }
            catch (IllegalArgumentException e) {
                return false;
            }
        }
    
    	public static void main(String[] args) {
    		System.out.println("Inserisci una data nel formato dd/mm/yyyy: ");
    		Scanner in = new Scanner(System.in);
    		String date = in.nextLine();
    		if (isValidDate(date))
    			System.out.println("La data è corretta");
    		else System.out.println("La data non è corretta");
    	}
    }
    Il problema è che il metodo ritorna sempre true. C'è qualcuno che mi sa dire perché?

    Grazie in anticipo per l'attenzione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.