Visualizzazione dei risultati da 1 a 9 su 9

Discussione: differenza Date

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    31

    differenza Date

    Ciao, stò cercando di calcolare la differenza tra 2 date per poi inserire un record ogni 30 giorni.
    Però ottengo date "sballate" e non ogni 30 giorni. Forse commetto un errore nel SimpleDateFormat?
    Grazie
    codice:
     SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd" );            
    String date_in = sdf.format( dateAndTime .getTime() );
    String date_out = sdf.format( dateAndTime1.getTime() );
                 int differenza_date = Days.daysBetween(new DateTime(date_in), new DateTime(date_out)).getDays();
                 int divisione = differenza_date / 30;//divido per 30 la differenza tra data iniz e fine
                 
              SQLiteDatabase db = mHelper.getWritableDatabase();
            ContentValues cv = new ContentValues();
            Calendar c = Calendar.getInstance();
            try {
                c.setTime(sdf.parse(date_in));
            } catch (java.text.ParseException e) {
                e.printStackTrace();
            }
            cv.put(tabellaTable.DATA, date_in);  
           db.insert(tabellaTable.TABLE_NAME, null, cv); 
           
           for(int i=1 ; i < differenza_date ; i+=divisione){
            c.add(Calendar.DATE, i);  
            date_in = sdf.format(c.getTime());
            cv.put(tabellaTable.DATA, date_in);
            db.insert(tabellaTable.TABLE_NAME, null, cv);
           }
            db.close();
            }

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Il SimpleDateFormat può andar bene come no, dipende dal formato di rappresentazione stringa in cui le date ti arrivano. Se ti arrivano in quel formato, non vedo che cosa possa centrare lui.

    Sicuramente un errore sta nel modo in cui hai impostato il ciclo for:

    codice:
    for(int i=1 ; i < differenza_date ; i+=divisione) {
       c.add(Calendar.DATE, i);
       ...
    }

    Cioè, questo ciclo for fa queste cose:

    1) Inizialmente setta "i" a 1
    2) Aggiunge "i" (cioè 1) al calendar... cioè, sposta il calendar al giorno successivo
    3) ... il resto

    Se il tuo intento è quello di inserire dei record "ogni 30 giorni", il for in quel modo di sicuro non va perchè alla prima iterazione inserisce un record 1 giorno dopo la prima data e non 30 giorno dopo.

    Non so cosa faccia la classe Days, anche se immagino sia un'utility per calcoli tra date... mi fido della sua bontà, non sapendo cosa faccia.

    Detto tutto questo, non capisco perchè tutta quella complessità.
    Se devi inserire dei record ogni 30 giorni tra una data e l'altra, non serve né fare calcoli, né altro:

    codice:
    Calendar d1 = ... // data iniziale
    Calendar d2 = ... // data finale
    
    for(int i=0; d1.before(d2); i++) {
       d1.add(Calendar.DATE, 30);
       if (d1.before(d2)) {
          ...   // Inserisci d1 nel DB
       }
    }
    Ciao.
    Ultima modifica di LeleFT; 27-01-2014 a 19:05
    "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

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    31
    ricevo le date da 2 textView, quindi devo convertire la stringa in calendario per aggiungere i giorni giusto?
    Ho fatto così, e anche con try/catch ma ho errore di parsing:
    codice:
    //Calendar date_in = ... // data iniziale    
                String data1 = (fmtDateAndTime.format(dateAndTime.getTime()));   
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy/mm/dd");
                Date date = sdf.parse(data1);
                 Calendar date_in = Calendar.getInstance();
                 date_in.setTime(date);
                 
                
                //Calendar date_out = ... // data finale
                String data2 = (fmtDateAndTime.format(dateAndTime1.getTime()));  
                SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy/mm/dd");
                Date date2 = sdf2.parse(data2);
                 Calendar date_out = Calendar.getInstance();
                 date_in.setTime(date);
                
                
            
            for(int i=0; date_in.before(date_out); i++) {
                Calendar cal=Calendar.getInstance();
                DateFormat format=new SimpleDateFormat("yyyy/mm/dd");
                format.format(date);
                cal=format.getCalendar();
                
                
                date_in.add(Calendar.DATE, 30);
                               if (date_in.before(date_out)) {
                                   SimpleDateFormat sdf1 = new SimpleDateFormat( "yyyy-MM-dd" );
                                    String strDate = sdf1.format( date_in );
                                     // Inserisci date_in nel DB
    Ultima modifica di GffJkc; 27-01-2014 a 20:38

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Quote Originariamente inviata da GffJkc Visualizza il messaggio
    ricevo le date da 2 textView, quindi devo convertire la stringa in calendario per aggiungere i giorni giusto?
    Ho fatto così, e anche con try/catch ma ho errore di parsing:
    "Ho errore in parsing". Cioè? Che errore? Come facciamo noi a sapere che errore hai se non posti nulla dell'eccezione che ti viene sollevata? Ricordati sempre di postare tutto lo stackTrace dell'eccezione: solo così possiamo cercare di capirne qualcosa.

    Una cosa che vedo subito è che il formato che tu passi al SimpleDateFormat è sbagliato: "mm" (con le "m" minuscole) è il segnaposto per i minuti, non per il mese, che è "MM" (con le "M" maiuscole). Quindi:

    codice:
    // Se ho la data così: 2014/01/28
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");

    Oltretutto, non ci dici nulla del formato stringa della data. Come ti arriva? Sei sicuro che la data ti arriva nel formato "yyyy/MM/dd"?
    Poi, non capisco perchè parti da un oggetto Date, per ottenere una stringa da ri-convertire nuovamente in un oggetto Date:

    codice:
    // Se dateAndTime.getTime() ritorna un oggetto Date
    // Qui lo trasformi in stringa
    String data1 = (fmtDateAndTime.format(dateAndTime.getTime()));   
    
    // Qui costruisci un date-format (ma è sbagliato perchè i mesi vanno con le "M" maiuscole)
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy/mm/dd");
    
    // Qui lo ri-converti di nuovo in Date... Perchè??
    Date date = sdf.parse(data1);

    Poi non capisco perchè costruisci ogni volta un nuovo SimpleDateFormat sempre con lo stesso formato... ne hai già uno, puoi ri-utilizzarlo quante volte vuoi, senza costruirne sempre di nuovi inutilmente, sprecando memoria.

    Inoltre, molte cose del ciclo for sembrano non avere alcun senso.

    codice:
    for(int i=0; date_in.before(date_out); i++) {
       // A che ti serve questo Calendar??
       Calendar cal=Calendar.getInstance();
    
       // Un nuovo dateFormat per ogni iterazione? Ne hai già
       // creati due identici fuori...
       DateFormat format=new SimpleDateFormat("yyyy/mm/dd");
    
       // Qui formatti una data in stringa e ne butti via
       // il risultato... che senso ha??
       format.format(date);
    
       // A che ti serve il Calendar interno del DateFormat??
       // E' un oggetto che serve solo al DateFormat per fare
       // le rappresentazioni e le conversioni...
       cal=format.getCalendar();
                
       // Ok...
       date_in.add(Calendar.DATE, 30);
    
       // Ok
       if (date_in.before(date_out)) {
    
          // Se questo ti serve per formattare la data nel formato usato
          // dal DB, può anche andare bene... ma:
    
          // 1) Sarebbe bene crearne uno solo FUORI dal ciclo for, non
          //    uno per ogni data che vuoi inserire: è uno spreco immane di memoria
    
          // 2) Sarebbe ancora meglio usare i PreparedStatement e lasciar fare
          //    a loro tutte le conversioni del caso
          SimpleDateFormat sdf1 = new SimpleDateFormat( "yyyy-MM-dd" );
          String strDate = sdf1.format( date_in );
          ...

    Io proverei a rivedere un po' tutto.


    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
    Registrato dal
    Jan 2014
    Messaggi
    31
    HAi ragione, ho fatto molta confusione, ma rivedendo il tutto ho questo:

    codice:
    //la data di inizio e fine hanno un formato che
    //varia a seconda del luogo in cui mi trovo. Le date sono impostate in questo modo:
     DateFormat fmtDateAndTime=DateFormat.getDateInstance();  
          Calendar dateAndTime=Calendar.getInstance();
          Calendar dateAndTime1=Calendar.getInstance();
    ...
    ...
    
    //ricevo le date 
    String data_inizio = mBtnPickDate.getText().toString();
    String data_fine = scadenza.getText().toString();
    
    //qui viene il dubbio, non posso confrontare 2 stringhe, quindi devo convertirle 
    
        Calendar gcal = Calendar.getInstance();
        SimpleDateFormat sdf1 = new SimpleDateFormat( "yyyy-MM-dd" );
        Date start = sdf1.parse(data_inizio);
        Date end = sdf1.parse(data_fine);
    //setto il calendario con la data di inizio per aggiungere i 30 giorni
        gcal.setTime(start);
    
            for(int i=0; start.before(end); i++) {
            
                gcal.add(Calendar.DATE, 30);
                               if (start.before(end)) {
                                 
                                    String strDate = sdf1.format( start );
                                     // Inserisci date_in nel DB
    ho comunque eccezione parsing.
    Ultima modifica di GffJkc; 28-01-2014 a 12:49

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Quote Originariamente inviata da GffJkc Visualizza il messaggio
    ho comunque eccezione parsing.
    Continui a non postare lo stackTrace dell'eccezione.

    "eccezione parsing" non vuol dire nulla. La JVM, quando solleva un'eccezione, dà un messaggio ben preciso e corredato di uno stackTrace: ovvero, ulteriori informazioni dettagliate sulla eccezione sollevata, il nome della classe che l'ha sollevata, il metodo dov'è stata sollevata, la riga di codice dov'è stata sollevata e tutte le chiamate che hanno portato a quella riga.

    Vuoi postare lo stackTrace dell'eccezione?

    Inoltre, continui a non dare indicazioni su cosa sia questo "mBtnPickDate" (mi fa pensare ad un componente per Android, cosa che finora non è mai stata specificata), né di che stringa ti arriva da questo oggetto.

    Se si tratta di Android, lo stackTrace dell'eccezione ce l'hai nel LogCat.


    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

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    31
    Si scusa, queste date mi hanno "inchiodato" il cervello....

    Dunque, sono su Android e "mBtnPickDate" è un button in cui viene settata la data tramite un DatePickerDialog e la stringa che arriva è la data scelta nel formato "Locale" che si adatta in base al paese " DateFormat fmtDateAndTime=DateFormat.getDateInstance(); "


    A questo punto ho inserito un try/
    catch per il parsing, come da codice sotto:
    codice:
        String data_inizio = mBtnPickDate.getText().toString();
                String data_fine = scadenza.getText().toString();
                
                Calendar gcal = Calendar.getInstance();
                  SimpleDateFormat sdf1 = new SimpleDateFormat( "yyyy-MM-dd" );
                  Date start = null;
                try {
                    start = sdf1.parse(data_inizio);
                } catch (java.text.ParseException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                  Date end = null;
                try {
                    end = sdf1.parse(data_fine);
                } catch (java.text.ParseException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                  gcal.setTime(start);
            for(int i=0; start.before(end); i++) {
                    gcal.add(Calendar.DATE, 30);
                               if (start.before(end)) {
                                 
                                    String strDate = sdf1.format( start );
                                     // Inserisci el DB


    questo è l'errore del parsing:
    codice:
    
    
    codice:
    01-28 07:42:56.779: W/System.err(795): java.text.ParseException: Unparseable date: "Jan 28, 2014" (at offset 0)
    01-28 07:42:56.779: W/System.err(795):     at java.text.DateFormat.parse(DateFormat.java:555)
    01-28 07:42:56.779: W/System.err(795):     at main.Ins.diff_date(Inserisci_entrate_uscite.java:463)
    01-28 07:42:56.789: W/System.err(795):     at java.lang.reflect.Method.invokeNative(Native Method)
    01-28 07:42:56.789: W/System.err(795):     at java.lang.reflect.Method.invoke(Method.java:525)
    01-28 07:42:56.789: W/System.err(795):     at android.view.View$1.onClick(View.java:3628)
    01-28 07:42:56.799: W/System.err(795):     at android.view.View.performClick(View.java:4240)
    01-28 07:42:56.799: W/System.err(795):     at android.view.View$PerformClick.run(View.java:17721)
    01-28 07:42:56.799: W/System.err(795):     at android.os.Handler.handleCallback(Handler.java:730)
    01-28 07:42:56.799: W/System.err(795):     at android.os.Handler.dispatchMessage(Handler.java:92)
    01-28 07:42:56.799: W/System.err(795):     at android.os.Looper.loop(Looper.java:137)
    01-28 07:42:56.809: W/System.err(795):     at android.app.ActivityThread.main(ActivityThread.java:5103)
    01-28 07:42:56.809: W/System.err(795):     at java.lang.reflect.Method.invokeNative(Native Method)
    01-28 07:42:56.809: W/System.err(795):     at java.lang.reflect.Method.invoke(Method.java:525)
    01-28 07:42:56.809: W/System.err(795):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
    01-28 07:42:56.819: W/System.err(795):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    01-28 07:42:56.819: W/System.err(795):     at dalvik.system.NativeStart.main(Native Method)
    01-28 07:42:56.819: W/System.err(795): java.text.ParseException: Unparseable date: "Jan 28, 2015" (at offset 0)
    01-28 07:42:56.830: W/System.err(795):     at java.text.DateFormat.parse(DateFormat.java:555)
    01-28 07:42:56.839: W/System.err(795):     at main.Inserisci_entrate_uscite.diff_date(Inserisci_entrate_uscite.java:470)
    01-28 07:42:56.839: W/System.err(795):     at java.lang.reflect.Method.invokeNative(Native Method)
    01-28 07:42:56.849: W/System.err(795):     at java.lang.reflect.Method.invoke(Method.java:525)
    01-28 07:42:56.849: W/System.err(795):     at android.view.View$1.onClick(View.java:3628)
    01-28 07:42:56.849: W/System.err(795):     at android.view.View.performClick(View.java:4240)
    01-28 07:42:56.859: W/System.err(795):     at android.view.View$PerformClick.run(View.java:17721)
    01-28 07:42:56.869: W/System.err(795):     at android.os.Handler.handleCallback(Handler.java:730)
    01-28 07:42:56.869: W/System.err(795):     at android.os.Handler.dispatchMessage(Handler.java:92)
    01-28 07:42:56.869: W/System.err(795):     at android.os.Looper.loop(Looper.java:137)
    01-28 07:42:56.879: W/System.err(795):     at android.app.ActivityThread.main(ActivityThread.java:5103)
    01-28 07:42:56.889: W/System.err(795):     at java.lang.reflect.Method.invokeNative(Native Method)
    01-28 07:42:56.889: W/System.err(795):     at java.lang.reflect.Method.invoke(Method.java:525)
    01-28 07:42:56.899: W/System.err(795):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
    01-28 07:42:56.899: W/System.err(795):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    01-28 07:42:56.909: W/System.err(795):     at dalvik.system.NativeStart.main(Native Method)

    e questo è l'errore del metodo:
    codice:
    
    
    codice:
    01-28 07:42:56.959: E/AndroidRuntime(795): FATAL EXCEPTION: main
    01-28 07:42:56.959: E/AndroidRuntime(795): java.lang.IllegalStateException: Could not execute method of the activity
    01-28 07:42:56.959: E/AndroidRuntime(795):     at android.view.View$1.onClick(View.java:3633)
    01-28 07:42:56.959: E/AndroidRuntime(795):     at android.view.View.performClick(View.java:4240)
    01-28 07:42:56.959: E/AndroidRuntime(795):     at android.view.View$PerformClick.run(View.java:17721)
    01-28 07:42:56.959: E/AndroidRuntime(795):     at android.os.Handler.handleCallback(Handler.java:730)
    01-28 07:42:56.959: E/AndroidRuntime(795):     at android.os.Handler.dispatchMessage(Handler.java:92)
    01-28 07:42:56.959: E/AndroidRuntime(795):     at android.os.Looper.loop(Looper.java:137)
    01-28 07:42:56.959: E/AndroidRuntime(795):     at android.app.ActivityThread.main(ActivityThread.java:5103)
    01-28 07:42:56.959: E/AndroidRuntime(795):     at java.lang.reflect.Method.invokeNative(Native Method)
    01-28 07:42:56.959: E/AndroidRuntime(795):     at java.lang.reflect.Method.invoke(Method.java:525)
    01-28 07:42:56.959: E/AndroidRuntime(795):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
    01-28 07:42:56.959: E/AndroidRuntime(795):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    01-28 07:42:56.959: E/AndroidRuntime(795):     at dalvik.system.NativeStart.main(Native Method)
    01-28 07:42:56.959: E/AndroidRuntime(795): Caused by: java.lang.reflect.InvocationTargetException
    01-28 07:42:56.959: E/AndroidRuntime(795):     at java.lang.reflect.Method.invokeNative(Native Method)
    01-28 07:42:56.959: E/AndroidRuntime(795):     at java.lang.reflect.Method.invoke(Method.java:525)
    01-28 07:42:56.959: E/AndroidRuntime(795):     at android.view.View$1.onClick(View.java:3628)
    01-28 07:42:56.959: E/AndroidRuntime(795):     ... 11 more
    01-28 07:42:56.959: E/AndroidRuntime(795): Caused by: java.lang.NullPointerException
    01-28 07:42:56.959: E/AndroidRuntime(795):     at java.util.Calendar.setTime(Calendar.java:1183)
    01-28 07:42:56.959: E/AndroidRuntime(795):     at main.Ins.diff_date(Ins.java:475)
    01-28 07:42:56.959: E/AndroidRuntime(795):     ... 14 more

    Ultima modifica di GffJkc; 28-01-2014 a 14:50

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    codice:
    java.text.ParseException: Unparseable date: "Jan 28, 2014" (at offset 0)
    at java.text.DateFormat.parse(DateFormat.java:555)
    at main.Ins.diff_date(Inserisci_entrate_uscite.java:463)

    Queste sono le righe essenziali che ti dicono esattamente cosa sta succedendo.

    Alla riga 463 del tuo file "Inserisci_entrate_uscite.java" stai dando in pasto ad un dateFormat la seguente stringa:

    "Jan 28, 2014"

    e gli stai chiedendo di parsarla per ottenere un oggetto Date.

    Ma quel dateFormat non si aspetta una stringa con quel formato... da dove arriva quella data? Il tuo dateFormat che stringhe si aspetta? In tutti i codici che hai postato, i tuoi dateFormat si aspettano le date nel formato "yyyy/MM/dd" oppure "yyyy-MM-dd". Nessuno dei due è il formato con cui è stata scritta quella data.

    Hai due possibilità:

    1) Cambi dateFormat, in modo che accetti date in quel formato ("M dd, yyyy")

    oppure

    2) Ti fai restituire una stringa nel formato che tu ti aspetti

    Non so se la seconda sia una strada percorribile (non sapendo CHI ti fornisce la data in quel formato, né se è possibile dirgli di cambiarlo).


    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

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    31
    codice:
    //all'inizio della classe dichiaro:
     DateFormat fmtDateAndTime=DateFormat.getDateInstance();  
          Calendar dateAndTime=Calendar.getInstance();
          Calendar dateAndTime1=Calendar.getInstance();
    
    //questo è il DatePicker per scegliere la data iniziale e identico è il secondo 
    //ma ovviamente con un altro oggetto Calendario: Calendar dateAndTime1=Calendar.getInstance();
    
     public void chooseDate(View v) {//---------------------------------------1
        new DatePickerDialog(Insert.this, d,
                              dateAndTime.get(Calendar.YEAR),
                             dateAndTime.get(Calendar.MONTH),
                              dateAndTime.get(Calendar.DAY_OF_MONTH))
          .show();
      }
      private void updateLabel() {
        mBtnPickDate.setText(fmtDateAndTime.format(dateAndTime.getTime()));           
      }
      DatePickerDialog.OnDateSetListener d=new DatePickerDialog.OnDateSetListener() {
        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            dateAndTime.set(Calendar.YEAR, year);
          dateAndTime.set(Calendar.MONTH, monthOfYear);
          dateAndTime.set(Calendar.DAY_OF_MONTH, dayOfMonth);
          updateLabel();
        }
      };

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.