Parsing da una stringa di qualunque formato a data

di il
5 risposte

Parsing da una stringa di qualunque formato a data

Salve esiste un metodo per parsare una qualunque stringa che rappresenti una data(per capirci nello stesso file ho 24/7/2018, 24 luglio 2018, luglio 24 2018,7/24/2018 e simili) in un oggetto Date?
saluti

5 Risposte

  • Re: Parsing da una stringa di qualunque formato a data

    Enrico92 ha scritto:


    Salve esiste un metodo per parsare una qualunque stringa che rappresenti una data(per capirci nello stesso file ho 24/7/2018, 24 luglio 2018, luglio 24 2018,7/24/2018 e simili) in un oggetto Date?
    Se intendi qualcosa che sia in grado di interpretare DA SOLO più formati di date .. no, non esiste nulla (perlomeno nel framework standard). Un DateFormat del framework è in grado di gestire 1 solo formato. Poi potresti avere più DateFormat e "provare" vari parsing con formati differenti. Questo è un altro paio di maniche ..
  • Re: Parsing da una stringa di qualunque formato a data

    andbin ha scritto:


    Enrico92 ha scritto:


    Salve esiste un metodo per parsare una qualunque stringa che rappresenti una data(per capirci nello stesso file ho 24/7/2018, 24 luglio 2018, luglio 24 2018,7/24/2018 e simili) in un oggetto Date?
    Se intendi qualcosa che sia in grado di interpretare DA SOLO più formati di date .. no, non esiste nulla (perlomeno nel framework standard). Un DateFormat del framework è in grado di gestire 1 solo formato. Poi potresti avere più DateFormat e "provare" vari parsing con formati differenti. Questo è un altro paio di maniche ..
    era proprio quello che volevo evitare...
  • Re: Parsing da una stringa di qualunque formato a data

    Enrico92 ha scritto:


    era proprio quello che volevo evitare...
    Ma se tu nel file in un certo punto hai una data che può essere in vari formati differenti es. "24/7/2018" o "24 luglio 2018" ecc.. e tu NON sai a priori quale formato sia né puoi dedurlo da altre informazioni del file .... l'unica è "provare" con vari parsing. E comunque qualcosina lo devi sapere almeno come "contesto" e cioè almeno il Locale (es. italiano).
  • Re: Parsing da una stringa di qualunque formato a data

    andbin ha scritto:


    Enrico92 ha scritto:


    era proprio quello che volevo evitare...
    Ma se tu nel file in un certo punto hai una data che può essere in vari formati differenti es. "24/7/2018" o "24 luglio 2018" ecc.. e tu NON sai a priori quale formato sia né puoi dedurlo da altre informazioni del file .... l'unica è "provare" con vari parsing. E comunque qualcosina lo devi sapere almeno come "contesto" e cioè almeno il Locale (es. italiano).
    in realtà il locale posso ricavarlo...ho tutti questi formati differenti per il fatto che devo fare scrape di diversi siti web da cui devo ricavare certe informazioni tra cui appunto le date del primo e dell ultimo articolo pubblicato, per cui essendo più fonti non ho una formattazione univoca, il problema più grosso è dovuto al fatto che alcuni siti sono veramente fatti con i piedi...
  • Re: Parsing da una stringa di qualunque formato a data

    Capisco, comunque per "provare" con più formati basta farsi una classettina es. MultiDateFormat come questa che ho scritto e provato al volo poco fa.
    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.ParsePosition;
    import java.text.SimpleDateFormat;
    import java.util.Arrays;
    import java.util.Date;
    import java.util.List;
    import java.util.Locale;
    
    public class ProvaDateMultiFormato {
        public static void main(String[] args) throws ParseException {
            SimpleDateFormat sdf1 = new SimpleDateFormat("dd/MM/yyyy", Locale.ITALIAN);
            sdf1.setLenient(false);
            SimpleDateFormat sdf2 = new SimpleDateFormat("dd MMMM yyyy", Locale.ITALIAN);
            sdf2.setLenient(false);
    
            MultiDateFormat mdf = new MultiDateFormat(sdf1, sdf2);
    
            System.out.println(mdf.parse("24/7/2018"));
            System.out.println(mdf.parse("24 luglio 2018"));
        }
    }
    
    
    class MultiDateFormat {
        private List<DateFormat> dateFormats;
    
        public MultiDateFormat(DateFormat... dfs) {
            dateFormats = Arrays.asList(dfs);
        }
    
        public Date parse(String str) throws ParseException {
            for (DateFormat df : dateFormats) {
                ParsePosition pp = new ParsePosition(0);
                Date d = df.parse(str, pp);
    
                if (d != null && pp.getIndex() == str.length()) {
                    return d;
                }
            }
    
            throw new ParseException("No date format suitable to parse the string: " + str, 0);
        }
    }
    Nota che ho gestito il parsing in modo molto (molto!) "stretto". I due SimpleDateFormat li ho impostati come NON "lenient" e il test sul index del ParsePosition permette di scartare date giuste ma ad esempio con spazi dietro es. "24 luglio 2018 " (nota lo spazio dopo 2018, sì è pignolo così).
    Ovviamente puoi "allentare" un po' il parsing e renderlo più permissivo.
Devi accedere o registrarti per scrivere nel forum
5 risposte