Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    41

    [java] prendere string trasformare in Calendar o controllare formato

    Il mi oproblema di oggi è questo: ho un campo di testo (jTextField) nel quale l'utente digita la data di nascita. Io prelevo il valore digitato con
    codice:
    String dataString = dataNascitaT.getText();
    ove dataNascitaT è il mio jTextField. Ora, non ho bisogno di fare calcoli sulla data, quindi potrei ipoteticamente anche non trasformare la stringa in data, però ho necessità di fare un controllo sul formato, se la data è stata inserita correttamente.
    Ho pensato a due possibilità:
    1) usare il SimpleDateFormat, ma ho trovato istruzioni solo per prendere un java.util.Date (che tra l'altro è deprecato, se mai userei se possiblie un
    codice:
    Calendar dataMia = new GregorianCalendar();
    ) e ottenere una String formattata, mentre non ho trovato il modo per prendere un String e formattarlo in data, cioè il contrario (e quello che serve a me). In questo modo, se anche fosse possibile, forse non saprei però effettivamente se la data è scritta bene, perché se per esempio mi scrivono "24122003" per intendere 24 ott 2003, non è che formattando questa stringa in data nel formato aaaa/MM/gg mi viene fuori che la data è 2412 20 03? cioè, ok non esiste il ventesimo mese, ma forse c'è una combinazione che ora non mi viene in cu la cosa non funziona.... :-) penso di aver reso l'idea di quello che vorrei dire...

    2) scrivere io un metodo che mi prende una sottostringa e me la controlla.... una cosa tipo:
    codice:
    if(nascitaString.length() == 10){ 
                    int indicePunti = nascitaString.indexOf('/');
                    if(indicePunti == 4) {
                        String nascitaAnno = nascitaString.substring(0, indicePunti);
                        String nascitaResto = nascitaString.substring(indicePunti+1);
                        int indiceResto = nascitaResto.indexOf('/');
                        if(indiceResto == 2){
                            nascitaResto = nascitaResto.substring(indiceResto+1);
                              if (nascitaResto.length() != 2)
                                  erroreData();
                        }
                        else erroreData();
                    }
                    else erroreData();
                }
                else erroreData();
    ove erroreData() è un metodo che mi evidenzia in rosso la label del campo...

    La possibilità 2) mi sembra un po' costruita e non so neanche se sia scritta bene...
    voi che mi dite a riguardo? Ripeto che il mio scopo è esclusivamente quello di controllare che la data sia stata scritta bene. Il formato deve essere per forza aaaa/MM/gg perché è quello che è nel database sql dove poi dovrò scrivere il dato ottenuto.
    Grazie mille a tutti quelli che mi vorranno rispondere e un grazie in più a chi lo farà presto :-)

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Non me ne volere, non hai saputo usare la documentazione a dovere.

    http://java.sun.com/javase/6/docs/ap...ateFormat.html

    c'è un metodo parse (anzi, due, visto che puoi accedere anche al metodo di DateFormat)

    - definisci il pattern del tuo SimpleDateFormat
    - recuperi un Date con parse

    se poi vuoi anche verificare che la data sia consistente (ossia di default una data tipo 30 Feb 2007 verrebbe trasformata in 2 Mar 2007...), con setLenient scegli che interpretazione dare.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    41
    Originariamente inviato da Andrea1979
    Non me ne volere, non hai saputo usare la documentazione a dovere.

    http://java.sun.com/javase/6/docs/ap...ateFormat.html

    c'è un metodo parse (anzi, due, visto che puoi accedere anche al metodo di DateFormat)

    - definisci il pattern del tuo SimpleDateFormat
    - recuperi un Date con parse

    se poi vuoi anche verificare che la data sia consistente (ossia di default una data tipo 30 Feb 2007 verrebbe trasformata in 2 Mar 2007...), con setLenient scegli che interpretazione dare.
    ciao Andrea1979, grazie dell'indicazione. Effettivamente non avevo visto la documentazione riguardo il pattern e nelle mie ricerche l'avevo incontrato in un esempio che non era calzante per la mia situazione per cui l'ho lasciato stare. :-)
    ora ho letto la documentazione, ma continuo però a non capire bene...
    in particolare, per i problemi che ho già indicato: come dicevo, se la data viene inserita male come per esempio senza le barre, lui la interpreta comunque come data, riportandola nel formato indicato nel SimpleDateFormat senza accorgersi di nulla, o sbaglio?
    Inoltre, il metodo parse prende come parametro una stringa e restituisce un Date (java.util.Date) che è deprecato: non è possibile usare un metodo che mi restituisca un Calendar senza passare per il Date, o al limite che mi agisca sulle stringhe, sempre senza passare per il Date?

    Grazie ancora per le eventuali risposte.

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    No, se tu definisci un SimpleDateFormat con un certo pattern (per esempio yyyy-MM-dd) e l'utente inserisce 06/09/2007, quando provi a parsare ti salta fuori un'eccezione (ok, data in formato sbagliato, nel catch fai spuntare una JDialog o JOptionPane o che di avvertimento). Se invece inserisse una data in formato valido, però priva di senso (per esempio: 2007-09-31) ecco che salta fuori l'eccezione se hai settato il SDF con setLenient(false)
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da shirim
    in particolare, per i problemi che ho già indicato: come dicevo, se la data viene inserita male come per esempio senza le barre, lui la interpreta comunque come data, riportandola nel formato indicato nel SimpleDateFormat senza accorgersi di nulla, o sbaglio?
    No, la questione è una sola: se il parsing viene fatto in modo "lenient" o "non lenient" (per default è lenient).

    Se fai:
    DateFormat df = new SimpleDateFormat ("d/M/y");
    Date d = df.parse ("32/06/2007");

    e stampi il date, ottieni: Sun Jul 02 00:00:00 CEST 2007
    Se è lenient, cerca di interpretare la data in modo un po' "euristico".

    Questa questione riguarda solo i valori dei campi, non il formato. Se il pattern è "d/M/y" e tu passi "01-01-2007", benché corretto come data, ottieni una ParseException perché comunque non è nel formato richiesto.

    Originariamente inviato da shirim
    Inoltre, il metodo parse prende come parametro una stringa e restituisce un Date (java.util.Date) che è deprecato
    Non è la classe Date ad essere "deprecata" bensì molti dei suoi costruttori e metodi. Date lo si può ancora usare senza problemi ma lo si deve trattare solamente come un oggetto che rappresenta un numero di millisecondi dalla "epoch" (la solita data di inizio del 1970). In pratica, ai giorni nostri, Date va usato solo come "ponte" tra un Calendar e un DateFormat (e viceversa chiaramente).

    Originariamente inviato da shirim
    non è possibile usare un metodo che mi restituisca un Calendar senza passare per il Date, o al limite che mi agisca sulle stringhe, sempre senza passare per il Date?
    Direi di no ma non vedo il problema. Come ho detto, si usa Date come "ponte".
    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
    Registrato dal
    Aug 2007
    Messaggi
    41
    ok grazie ad entrambi!!
    per la questinoe del Date deprecato ora ho ben chiara la cosa e mi rallegro che si possa usare, anche perché nell'altro programma per l'esame che ho concluso il mese scorso ma che non ho ancora potuto consegnare l'ho usato, proprio per un passaggio del genere :-)

    Anche per quanto riguarda il SimpleDateFormat e le eventuali immissioni errate, grazie mille siete stati molto chiari. Ho un'altro piccolo dubbio a riguardo: ho visto nella documentazione linkata che il metodo parse se non riconosce il formato mi restituisce null...
    (riporto:
    Returns:
    A Date parsed from the string. In case of error, returns null.
    ).
    Io ho scritto il codice in modo che se trova null in quel campo (secondo le mie intenzion doveva accadere soltanto se non era stato inserito alcun valore) compare appunto il warning che non è stato inserito il valore.... come potrei fare per distinguere i due casi?

    grazie ancora

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da shirim
    Ho un'altro piccolo dubbio a riguardo: ho visto nella documentazione linkata che il metodo parse se non riconosce il formato mi restituisce null...
    Non hai letto bene. Esistono 2 parse(), uno prende solo String (questo metodo lancia ParseException) e l'altro prende String e ParsePosition (questo metodo ritorna null, non lancia ParseException).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    41
    Originariamente inviato da andbin
    Non hai letto bene. Esistono 2 parse(), uno prende solo String (questo metodo lancia ParseException) e l'altro prende String e ParsePosition (questo metodo ritorna null, non lancia ParseException).
    infatti leggevo nella pagina linkata che è riferita al SimpleDateFormat che elenca un unico metodo parse (il secondo)... con la tua indicazione ho trovato anche l'altro, ereditato da DateFormat, che prende solo String... dunque devo usare quello e cercare di gestire l'errore captando il ParseException ed agendo di conseguenza...
    ok! allora per adesso grazie :-)

    Ora mentre sistemo la questione sono incorsa in un'altra difficoltà: non so se è OT parlarne qui o dovrei apripre un altro topic, ma mi sembra sprecato dato che in effetti si tratta dello stesso campo e spero di risolvere al volo....se mai fatemi sapere e scusatemi:

    io ho inserito la parte di controlllo in un
    private void dataNascitaTActionPerformed(java.awt.event.ActionE vent evt)
    che mi reagisce all'inserimento del dato se si preme invio.... se però ci si sposta da un campo all'altro col mouse o col tab lui non si accorge e non effettua il controllo. c'è un modo per dirgli che non appena lascio il campo lo deve controllare? tipo usando un altro tipo i listener, che so un propertyChanged al posto dell'actionPerformed che suppongo non faccia rientrare nelle "action" supportate lo spostamento col tab? o il propertyChange agisce ad ogni carattere digitato per cui mi visualizza l'erroe anche se semplicemente non ho finito di digitare la parola? o ancora potrebbe essere sufficiente un focusLost?
    scusate e grazie ancora

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2007
    Messaggi
    41
    Originariamente inviato da shirim
    o ancora potrebbe essere sufficiente un focusLost?
    ne ho tentati diversi.... il focusLost funziona :-)

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 © 2026 vBulletin Solutions, Inc. All rights reserved.