JavascriptProva

giovedì 19 gennaio 2017

Salvataggio di date come Long in un database e rilevarne valori minimo e massimo.

Se io devo impostare una data, cosa mi conviene, usare Date o Calendar?
E come si fa?

Prima modalità:
        Date data1=new Date("5/09/1961");
        Date data2=new Date("13/06/1962");
        System.out.println(data1);
Ottengo:
01-19 00:48:04.397 28832-28832/? I/System.out: Tue May 09 00:00:00 GMT+00:00 1961
In questo modo (deprecato) bisogna ordinare mese e giorno secondo la notazione anglosassone, però.

Un'altra modalità sarebbe convertire la stringa in Date:
        Date data1=new Date();
        String strDat="5/9/1961";
        SimpleDateFormat sdf=new SimpleDateFormat("dd/MM/yyyy");
        try {
            data1=sdf.parse(strDat);
            System.out.println(data1);
        } catch (ParseException e) {
            e.printStackTrace();
        }
01-19 00:58:48.387 31082-31082/? I/System.out: Tue Sep 05 00:00:00 GMT+00:00 1961
Queste modalità creano un tipo Date (ovviamente contenente una data) a partire da una data specifica, espressa come stringa.


Per riportare il tipo Date a stringa, si usa sempre SimpleDateFormat con l'istruzione format.

Ora metto diverse date in ordine sparso nel database e poi le ordino con ORDER BY.
Queste sono le date ordinate, ottenute creando tipi Date con la stringa della data come parametro nel costruttore, i quali vengono memorizzati mediante la funzione Date.getTime().
Vengono ripresi dal database creando un Date avente nel costruttore il Long.
        Date data1=new Date("09/05/1961");
        Date data2=new Date("01/10/2003");
        Date data3=new Date("06/13/1962");

        helper.save(data1.getTime());
        helper.save(data2.getTime());
        helper.save(data3.getTime());
,,,

            public void onClick(View v) {
                Cursor crs=helper.query();
                do {
                    System.out.println(new Date(crs.getLong(crs.getColumnIndex("millidat"))));
                }while(crs.moveToNext());
            }
Ora invece di Date uso Calendar:
        Calendar data1=Calendar.getInstance();
        data1.set(Calendar.YEAR,1961);
        data1.set(Calendar.MONTH,8);
        data1.set(Calendar.DAY_OF_MONTH,5);
        
Questo porta via molto tempo e codice: c'è un modo più facile di creare un Calendar impostando una data?
Sì, c'è:
        Calendar cal1=Calendar.getInstance();
        Calendar cal2=Calendar.getInstance();
        Calendar cal3=Calendar.getInstance();
        cal1.set(1961,8,5);
        cal2.set(2003,0,10);
        cal3.set(1962,5,13);

        helper.save(cal1.getTimeInMillis());
        helper.save(cal2.getTimeInMillis());
        helper.save(cal3.getTimeInMillis());

Salvati i dati nel database, ho trovato come estrapolarne il minimo e il massimo:
    public Cursor query(){
        SQLiteDatabase db=this.getWritableDatabase();
        Cursor c=db.rawQuery("select min(millidat) as millidat from tabella",null);
        c.moveToFirst();
        return c;
    }
    public Cursor query(){
        SQLiteDatabase db=this.getWritableDatabase();
        Cursor c=db.rawQuery("select max(millidat) as millidat from tabella",null);
        c.moveToFirst();
        return c;
    }

CalendarPickerView: parametri di init e range.

Questo datepicker prende due parametri di data.
Nominiamoli "primadata" e "secondadata" o qualcosa di simile.
Ora faccio che primadata è oggi, e secondadata è pure oggi.
Metto da parte il codice per l'evento di selezione delle date sul datePicker.
        pickerView.setOnDateSelectedListener(new CalendarPickerView.OnDateSelectedListener() {

            @Override
            public void onDateSelected(Date date) {
                ArrayList range = (ArrayList) pickerView.getSelectedDates();
            }

            @Override
            public void onDateUnselected(Date date) {

            }

        });


Ora cancello e procedo...
public class MainActivity extends AppCompatActivity {

    Calendar primaData;
    Calendar secondaData;


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

        pickerView = (CalendarPickerView) findViewById(R.id.calendar_view);

        primaData = Calendar.getInstance();
        secondaData=Calendar.getInstance();



        pickerView.init(primaData.getTime(), secondaData.getTime())
                .withSelectedDate(primaData.getTime())
                .inMode(CalendarPickerView.SelectionMode.RANGE);
    }
}
Errore perché la data selezionata deve essere fra la prima e l'ultima.
Provo ad aumentare la seconda di un giorno, ma non so come si fa.
Fatto, ora me l'accetta.
Ecco, quindi i due parametri di init definiscono il periodo in cui si può selezionare il range.
withSelectedDate esprime la data selezionata di base, che può anche mancare.

martedì 17 gennaio 2017

Regole per il parsing di y in SimpleDateFormat

Ho trovato un costruttore di SimpleDateFormat che non ha parametri. Forse per il parse, ossia la conversione di una stringa in tipo Date, è sufficiente questo costruttore. Sperimentiamo...

No.
E' necessario però imparare le regole, e ce ne sono sia per il parsing sia per il formatting.
PARSING: REGOLE PER YEAR:
Se le y sono fino a 2, l'anno viene interpretato come troncato delle prime due cifre: 61 viene inteso come '61 ovvero 1961;
Se le y sono più di 2, l'anno viene interpretato in senso letterale: 61 viene inteso come 61 dopo Cristo.
        String strData="5/9/61";
        Date dat;
        SimpleDateFormat sdf=new SimpleDateFormat("d/M/y");
        try {
            dat=sdf.parse(strData);
            System.out.println(dat);
        } catch (ParseException e) {
            System.out.println("errore");
        }
01-17 17:20:49.099 5729-5729/? I/System.out: Tue Sep 05 00:00:00 GMT+00:00 1961


        String strData="5/9/61";
        Date dat;
        SimpleDateFormat sdf=new SimpleDateFormat("d/M/yy");
        try {
            dat=sdf.parse(strData);
            System.out.println(dat);
        } catch (ParseException e) {
            System.out.println("errore");
        }
01-17 17:21:57.209 5812-5812/? I/System.out: Tue Sep 05 00:00:00 GMT+00:00 1961


        String strData="5/9/61";
        Date dat;
        SimpleDateFormat sdf=new SimpleDateFormat("d/M/yyy");
        try {
            dat=sdf.parse(strData);
            System.out.println(dat);
        } catch (ParseException e) {
            System.out.println("errore");
        }
01-17 17:38:03.107 5937-5937/? I/System.out: Sat Sep 05 00:00:00 GMT+00:00 61

Ripasso Date e SimpleDateFormat

Studio del Calendar.
Mi ricordo che avevo già avuto a che fare con le date e il Calendar. Vediamo di ritrovare i miei appunti. In fondo è per questo, fra l'altro, che tengo un blog.

Link di riferimento
La base di tutto è il SimpleDateFormat.
Se ricordo bene, si crea una variabile di tipo SimpleDateFormat, che si istanzia come?
Semplicemente con new SimpleDateFormat avente per parametro una stringa con il formato in formato stringa.
Ci proviamo.

Scrivo una data in formato stringa, quindi creo un SimpleDateFormat, quindi vedrò come convertirlo in oggetto tipo Date.
        String strData="5/9/1961";
        
        SimpleDateFormat sdf=new SimpleDateFormat("dd/MM/yyyy");
Si converte con il metodo parse di SimpleDateFormat.
        String strData="5/9/1961";

        SimpleDateFormat sdf=new SimpleDateFormat("dd/MM/yyyy");

        try {
            Date dat=sdf.parse(strData);
            System.out.println(dat);
        } catch (ParseException e) {
            e.printStackTrace();
        }
E così funziona:
01-17 16:45:44.392 4692-4692/? I/System.out: Tue Sep 05 00:00:00 GMT+00:00 1961
Quindi è parse. Ho qualche perplessità sul parametro di SimpleDateFormat, che vedrò dopo per evitare di impelagarmi.
Vediamo l'operazione inversa, che si dovrebbe fare con format.
Mi predispongo un tipo Date ben individuato. Quindi lo converto in stringa mediante format.
        Date dat=new Date();
        String strDate;

        SimpleDateFormat sdf=new SimpleDateFormat("dd/MM/yyyy");
        strDate=sdf.format(dat);
        System.out.println(strDate);
E funziona:
01-17 16:57:59.640 4841-4841/? I/System.out: 17/01/2017