JavascriptProva

giovedì 1 dicembre 2016

Inserimento della data e riconoscimento di vari formati di date

Obiettivo: Permettere il riconoscimento come data di vari formati inseriti liberamente.

Vado subito a fare una ricerca...

Teniamo presente che bisogna comunque e sempre usare la classe Calendar.

E creiamo un'istanza di Calendar...
Calendar calendar= Calendar.getInstance();
E fin qui non ci sono dubbi, anche se non abbiamo risolto niente.

La classe che aveva un ruolo, se ricordo bene, nella conversione di date, era SimpleDateFormat.
Provo ad istanziarla...

.....

Bene, ho fatto un po' di ricerche e pare che l'unico modo sia preparare una serie di formati di data confrontandoli con ciò che viene scritto.
Quali possono essere i formati di data più "immediati"?
Tipo:
  1. 5 9 1961
  2. 5 9 61
  3. 05 09 1961
  4. 05 09 61
  5. 5/9/1961
  6. 5/9/61
  7. 05/09/1961
  8. 05/09/61
... mi sta venendo un'idea: e se attraverso la manipolazione delle stringhe parificassi i vari formati di data convertendo in spazio vuoto sia gli slash sia gli eventuali trattini?7 Sarebbe fattibile.
Vediamo come si può manipolare una stringa.

Ottimo!
Praticamente il metodo replace() fa perfettamente al caso mio.
Per convertire una stringa in cui le varie parti di una data siano separate da uno spazio qualora venga introdotta con degli slash, si può usare questa sintassi:
        String stringa="5/9/1961";

        stringa=stringa.replace('/',' ');

        System.out.println(stringa);
Ed ecco l'output:
12-01 13:53:38.906 4629-4629/? I/System.out: 5 9 1961
Stessa cosa con il trattino:
        String stringa="5-9-1961";

        stringa=stringa.replace('-',' ');

        System.out.println(stringa);
12-01 13:54:50.784 4717-4717/? I/System.out: 5 9 1961
Se vengono presi in considerazione caratteri che non fanno parte della stringa, vengono bellamente ignorati:
        String stringa="5 9 1961";

        stringa=stringa.replace('/',' ');

        System.out.println(stringa);
12-01 13:56:24.096 4808-4808/? I/System.out: 5 9 1961
Questo mi consente di mettere in sequenza le "normalizzazioni" della stringa.
Ora torno al codice che mi deve parsare la stringa.
L'uso di setLenient=false è importante per far lanciare eccezione qualora il formato della stringa non rispecchi quello voluto.

Bene.
Mi costruisco un array di SimpleDateFormat.
Ecco il codice che ho scritto: sembra che sia sufficiente usare come parametro di SimpleDateFormat la stringa "dd MM yyyy" per accettare tutti i vari formati che avevo elencato sopra, tranne quando la separazione tra le cifre è fatta con uno slash o un trattino.
        ArrayList<SimpleDateFormat> lista=new ArrayList<SimpleDateFormat>();
        lista.add(new SimpleDateFormat("dd/MM/yyyy"));

        for(SimpleDateFormat format : lista){
            try {
                format.setLenient(false);
                format.parse(stringa);
                System.out.println("CORRETTO");
            } catch (ParseException e) {
                System.out.println("ERRORE");
            }

        }
Credo di poter lavorare con una certa dose di correttezza sufficiente se pongo che il mese vada sempre introdotto in numero, riportando tutto a un formato "normale" mediante la sostituzione dei simboli di separazione con spazi vuoti.
No! C'è qualche problema con l'anno.
Se io scrivo yyyy e introduco l'anno in due cifre, me lo conta senza le prime due cifre, ossia il 61 dopo Cristo.
Devo poter discriminare dalla stringa se l'ultimo pezzo dopo lo spazio vuoto è di due o quattro cifre.

Come fare?
Mediante il metodo lastIndexOf della stringa posso risalire, sottraendo la posizione del carattere dalla lunghezza della stringa, alla posizione da destra del carattere.
Ecco come ho risolto per il momento il problema. L'utente viene obbligato a scrivere l'anno in due o quattro cifre, se ne usa un numero diverso incorre nell'errore.
La data è giusta comunque:
public class MainActivity extends AppCompatActivity {

    SimpleDateFormat sdf;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Date date=null;
        String stringa="5 09 961";

        int posizione=stringa.length()-stringa.lastIndexOf(" ");

        if(posizione==5){
            sdf=new SimpleDateFormat("dd M yyyy");
        }
        if(posizione==3){
            sdf=new SimpleDateFormat("dd M yy");
        }
        else{
            System.out.println("ERRORE");
        }

        try {
            date=sdf.parse(stringa);
            System.out.println(date.toString());
        } catch (ParseException e) {
            System.out.println("ERRORE");
        }

    }
}

Nessun commento:

Posta un commento