Visualizzazione dei risultati da 1 a 7 su 7

Discussione: Distanza fra 2 date

  1. #1

    Distanza fra 2 date

    Ciao,
    devo realizzare un programma che, inserita una data futura, calcoli la distanza in formato gg/mm/aaaa tra la data odierna e quella futura.

    Il primo problema che ho riscontrato è che non mi appare niente sullo schermo, neanche degli alert. Il secondo è che non sono sicuro della correttezza di alcune operazioni come
    codice:
     dgiorno=day+(ngiorni[mese-1]-giorno);
    Vi posto il codice intero.

    codice:
    <html>
    <head>
    </head>
    <body>
     <script language="javascript">
      var danno, dmese, dgiorno, day, month, year, anno, mese, giorno;
      anno= data.getYear();
      mese = data.getMonth();
      giorno = data.getDay();
      day=prompt("Inserisci il giorno");
      month=prompt("Inserisci il mese");
      year=prompt("Inserisci l'anno");
      ngiorni= new Array();
      ngiorni[0]=31; //Gennaio
      ngiorni[1]=28; //Febbraio non bisestile
      ngiorni[2]=31; //Marzo
      ngiorni[3]=30; //Aprile
      ngiorni[4]=31; //Maggio
      ngiorni[5]=30; //Giugno
      ngiorni[6]=31; //Luglio
      ngiorni[7]=31; //Agosto
      ngiorni[8]=30; //Settembre
      ngiorni[9]=31; //Ottobre
      ngiorni[10]=30; //Novembre
      ngiorni[11]=31; //Dicembre
      if((anno % 400 == 0) || (anno % 100 != 0 && anno % 4 == 0))
       ngiorni[1]=29; //Febbraio bisestile
      
      if (((month1 > 12) || (month1 < 1)) || ((month2 > 12) || (month2 < 1))) //Controllo sui mesi
       month=prompt("Il mese inserito e' inesistente. Reinseriscilo. ");
      if (((day > 31) || (day < 1)) && ((month == 1) || (month == 3) || (month == 5) || (month == 7) || (month == 8) || (month == 10) || (month == 12))) //Controllo mesi con 31 giorni
       day=prompt("Il giorno inserito e' inesistente. Reinseriscilo. ");
      if (((day > 30) || (day < 1)) && ((month == 4) || (month == 6) || (month == 9) || (month == 11))) //Controllo mesi con 30 giorni
       day=prompt("Il giorno inserito e' inesistente. Reinseriscilo. ");
      if (((day > 29) || (day < 1)) && (month == 2)) //Controllo Febbraio non bisestile
       day=prompt("Il giorno inserito e' inesistente. Reinseriscilo. ");
      if (((day > 28) || (day < 1))  && ((month == 2) && ((((year % 4) != 0) || (((year % 100) == 0) && ((year % 400) != 0)))))) //Controllo Febbraio bisestile
       day=prompt("Il giorno inserito e' inesistente. Reinseriscilo. ");
      //danno
      if((month==mese)&&(day>=giorno)|| (month>mese))
       danno=year-anno;
      else
       danno=(year-anno)-1;
      //dmese
      if((month>=mese)&&(day>=giorno))
       dmese=month-mese;
      else
      {
       if((month>mese)&&(day<giorno))
        dmese=(month-mese)-1;
       else
       {
        if((month<mese)&&(day>=anno))
         dmese=(month+12)-mese;
        else
         dmese=(((month+12)-mese)-1);
       }
      }
      //dgiorno
      if(day>=giorno)
       dgiorno=day-giorno;
      else
       dgiorno=day+(ngiorni[mese-1]-giorno);
      document.write("La distanza tra le due date e':" +dgiorno+ "giorni " +dmese "mesi" +danno+ "anni");
     </script>
    </body>
    </html>
    Ciao e grazie mille in anticipo.
    Your time is limited, so don't waste it living someone else's life. Stay hungry, stay foolish. (Steve Jobs)

  2. #2
    Moderatore di CSS L'avatar di KillerWorm
    Registrato dal
    Apr 2004
    Messaggi
    5,771
    Ciao, ci sono diversi errori di sintassi.

    • Nell'ultima riga dello script manca un "+" dopo "dmese";
    • Nelle prime righe l'oggetto "data" non esiste. Ci manca probabilmente una roba del genere:
      codice:
      date = new Date();
    • "month1" e "month2" risultano non definiti


    Il procedimento per valutare la differenza tra le date credo non sia corretto.
    Installa Forum HTML.it Toolset per una fruizione ottimale del Forum

  3. #3
    Moderatore di JavaScript L'avatar di br1
    Registrato dal
    Jul 1999
    Messaggi
    19,998
    Poiche' la strana natura delle date e dei calcoli fra esse, per le quali giorni, mesi e anni non sono multipli fra loro, solitamente per "differenza fra due date" si intende "il numero di anni, mesi, giorni da aggiungere ad una data per raggiungere l'altra"


    Se ti ritrovi in questa definizione allora la via e' semplice: aggiungi anni alla prima data finche' la stessa rimane minore della data d'arrivo, stessa cosa per mesi e giorni ed avrai risolto il quesito.
    codice:
    <script>
    oggi = new Date();
    futuro = new Date(2015,5,19); // 19 giugno 2015 : ricorda che il mese va da 0 a 11
    var aa=0;mm=0;gg=0;
    while (oggi<futuro) {oggi.setFullYear(oggi.getFullYear()+1);aa++} oggi.setFullYear(oggi.getFullYear()-1); aa--;
    while (oggi<futuro) {oggi.setMonth(oggi.getMonth()+1);mm++} oggi.setMonth(oggi.getMonth()-1);mm--;
    while (oggi<futuro) {oggi.setDate(oggi.getDate()+1);gg++} gg--;
    alert(''+gg+' giorni, '+mm+' mesi, '+aa+' anni')
    </script>
    Il guaio per i poveri computers e' che sono gli uomini a comandarli.

    Attenzione ai titoli delle discussioni: (ri)leggete il regolamento
    Consultate la discussione in rilievo: script / discussioni utili
    Usate la funzione di Ricerca del Forum

  4. #4
    Ciao br1,
    innanzitutto vorrei ringraziarti per aver postato un versione più breve ed efficace del codice.

    Vorrei però farti delle domande sul codice da te postato.

    1) Come mai le variabili (aa,mm,gg) dentro il while, non presentano il punto e virgola dopo il loro incremento?
    codice:
     mm++ //No c'è il punto e virgola
    2)Perché una volta che hai compiuto le operazioni entro il while, una volta uscito le decrementi di 1?
    codice:
     oggi.setFullYear(oggi.getFullYear()-1); 
      aa--;
    3)Perché quado operi con i giorni non segui un procedimento uguale a quello dei mesi e degli anni, mafai solo gg--?
    codice:
     gg--;
    Ciao e grazie.

    P.S. Lo so che sono un po' di domande, ma non mi piace copiare le cose e basta, io voglio cercar di capire il meccanismo e il ragionamento che ci è dietro.
    Your time is limited, so don't waste it living someone else's life. Stay hungry, stay foolish. (Steve Jobs)

  5. #5
    Moderatore di JavaScript L'avatar di br1
    Registrato dal
    Jul 1999
    Messaggi
    19,998
    il ; alla fine dell'istruzione e' opzionale, e' indispensabile se seguito da altra istruzione sulla stessa riga
    si decrementano anni e mesi e la data perche' quando scatta il controllo la data d'arrivo e' ormai superata e quindi occorre ripristina il valore precedente, e' inutile ripristinare la data dopo il calcolo dei giorni perche' ormai non serve piu'.

    Il guaio per i poveri computers e' che sono gli uomini a comandarli.

    Attenzione ai titoli delle discussioni: (ri)leggete il regolamento
    Consultate la discussione in rilievo: script / discussioni utili
    Usate la funzione di Ricerca del Forum

  6. #6
    Ok,
    ma allora perché vanno decrementi aa, mm e gg se poi non vengono passati nel controllo?
    Io poi ho messo al posto dei numeri delle variabili, ma non capisco perché la differenza dei giorni è minore di 1 rispetto alla risposta corretta.
    codice:
    <html>
    <head>
    </head>
    <body>
     <script language="javascript">
      var day, month, year;
      day=prompt("Inserisci il giorno");
      month=prompt("Inserisci il mese");
      year=prompt("Inserisci l'anno");
      oggi = new Date();
      futuro = new Date(year,month-1,day); //Il mese va da 0 a 11
      var aa=0;mm=0;gg=0;
      while (oggi<futuro)
      {
       oggi.setFullYear(oggi.getFullYear()+1); //Il getFullYear() restituisce l'anno di una specificata data
       aa++;
      } 
      oggi.setFullYear(oggi.getFullYear()-1); //si decrementano anni e mesi e la data perche' quando scatta 
      aa--;         //il controllo la data d'arrivo e' ormai superata e quindi      
      while (oggi<futuro)      //occorre ripristina il valore precedente
      {
       oggi.setMonth(oggi.getMonth()+1);
       mm++;
      } 
      oggi.setMonth(oggi.getMonth()-1);
      mm--;
      while (oggi<futuro)
      {
       oggi.setDate(oggi.getDate()+1);
       gg++;
      } 
      gg--; 
      //E' inutile ripristinare la data dopo il calcolo dei giorni perche' ormai non serve piu'.
      alert('Tra le due date ci sono '+gg+' giorni, '+mm+' mesi, '+aa+' anni')
     </script>
    </body>
    </html>
    Ciao e grazie ancora
    Your time is limited, so don't waste it living someone else's life. Stay hungry, stay foolish. (Steve Jobs)

  7. #7
    Moderatore di JavaScript L'avatar di br1
    Registrato dal
    Jul 1999
    Messaggi
    19,998
    Insomma, a fare i pignoli fra le 23:59:59 di ieri e le 0:00:01 di domani ci passa quasi esattamente un giorno

    Se non ti va il risultato non decrementare l'utimo gg... e' solo una questione di convenzioni e di mettersi d'accordo sul metodo di calcolo
    Il guaio per i poveri computers e' che sono gli uomini a comandarli.

    Attenzione ai titoli delle discussioni: (ri)leggete il regolamento
    Consultate la discussione in rilievo: script / discussioni utili
    Usate la funzione di Ricerca del Forum

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.