Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Calcolare giorni lavorativi comprese tra due date

    Buona sera, avrei bisogno di una grossa mano, in un modulo PDF ho bisogno di visualizzare in un campo che chiameremo "TotGiorni" un numero ricavato dall'intervallo di due campi data, che chiameremo "Dalgg" e "Algg", come da titolo i giorni sono lavorativi e si possono sviluppare in una settimana lavorativa di 5 gg o di 6 gg (Sabato incluso), in tutto questo per calcolare i giorni di effettivo lavoro sono da considerare anche le festività compresa il santo patrono e la pasqua (o meglio la pasquetta visto che la pasqua cade sempre di domenica), per farmi restituire i giorni effettivi tra due date ho usato questo script :

    codice:
    //console.show();
    //console.clear();
    
    
    var strStart = this.getField("dalgg").value;
    var strEnd = this.getField("Algg").value;
    if(strStart.length && strEnd.length)
    {
      var dateStart = util.scand("dd/mm/yyyy",strStart);
      var dateEnd = util.scand("dd/mm/yyyy",strEnd);
      var diff = dateEnd.getTime() - dateStart.getTime();
      var oneDay = 24 * 60 * 60 * 1000;
      var days = Math.floor(diff/oneDay);
      event.value = 1+days;
    }
    else
      event.value = 0;
    dove il 1+days mi ritorna 1 se il giorno lavorativo è compreso tra la stessa data (data inizio oggi, data fine oggi), viceversa se non aggiungevo quell' 1 mi restituiva 0.

    potreste darmi una mano di aiuto per favore? non so come fare, sono molto scarso, come posso fare ad implementare a questo codice la funzione per determinare i sabati le domeniche i festivi pasqua e pasquetta affinchè vengano sottratti dal numero di giorni che sarebbero effettivamente lavorativi e poter scegliere se il calcolo dei giorni fa fatto su 5 giorni lavorativi o su 6 se includiamo il sabato?

    Grazie a tutti comunque



  2. #2
    Moderatore di JavaScript L'avatar di br1
    Registrato dal
    Jul 1999
    Messaggi
    19,998
    Devi scorrere i giorni a partire dal primo e verificare se e' un sab/dom ; se e' una festa fissa nell'anno (natale, capodanno, 15 agosto, ecc.) ; se e' pasquetta (qui o ti carichi un calendario fisso oppure devi calcolartela https://it.wikipedia.org/wiki/Calcolo_della_Pasqua )

    ps: il patrono dipende dalla localita'... divertiti
    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

  3. #3
    insomma c'è poco da divertirsi

    br1 Ho trovato questo tuo script in questo forum

    codice:
    function Pasqua(yyyy) {
    // RITORNA DATA DELLA PASQUA fra il 1753 e il 2500
    var Ap, Bp, Cp, Dp, Ep, Fp, Mp;
      if (yyyy<100) yyyy = 1900 + yyyy;
      Ap = yyyy % 19;
      Bp = yyyy % 4;
      Cp = yyyy % 7;
      Dp = (19*Ap + 24) % 30;
      Fp = 0;            // correzione per secoli
      if (yyyy<2500) Fp=3;
      if (yyyy<2300) Fp=2;
      if (yyyy<2200) Fp=1;
      if (yyyy<2100) Fp=0;
      if (yyyy<1900) Fp=6;
      if (yyyy<1800) Fp=5;
      if (yyyy<1700) Fp=4;
      Ep = (2*Bp + 4*Cp + 6*Dp + Fp + 5) % 7;
      Ep = 22 + Dp + Ep;
      Mp = 3;
      if (Ep>31) {
        Mp = 4;
        Ep = Ep - 31;
      }
      return (new Date(yyyy, Mp-1, Ep));
    }
    // ' ----------------------------------------------------------- 
    function isFest(data) {
    var s,d,p,ff,f
        // sabato
        s = (data.getDay()==6);
        // domenica
        d = (data.getDay()==0);
        // pasquetta
        pp = Pasqua(data.getFullYear());
        qq = data;
        qq.setDate(qq.getDate()-1);
        p = (date2str(qq) == date2str(pp));
        // FISSI
        ff = " 0101 0106 0425 0501 0602 0815 1101 1208 1225 1226 "
        // PATRONO
        ff += " 1030 "
        // data in stringa
        ss = date2str(data);
        f = (ff.indexOf(ss.substr(4))>0);
        return (d || s || p || f);
    }
    // ' ----------------------------------------------------------- 
    function date2str(dd) {
        return String(dd.getFullYear()*10000 + (dd.getMonth()+1)*100 + dd.getDate())
    }
    che potrebbe fare al caso mio, se non fosse per l'ultima parte di codice che non restituisce un numero ma una data, come potrei implementarla ? per far si che si adatasse alla mia esigenza?
    Ultima modifica di diego1966; 08-05-2017 a 01:26

  4. #4
    @br1 , perchè devo necessariamente formattare la data in mm/dd/yyyy nella tua funzione, perdonami io conosco discretamente il VBA, e lì non devo necessariamente formattare le date "All'americana" , quindi mi chiedevo se cambiare la formattazione possa influire sul risultato finale, l'ho detto ...sono molto scarso, sono ancora alla A dello JS, non sono neanche arrivato alla B

  5. #5
    Moderatore di JavaScript L'avatar di br1
    Registrato dal
    Jul 1999
    Messaggi
    19,998
    Confesso, ho cercato di stimolarti perlomeno ad impostare la logica, ma vedo che mi hai sgamato.

    Hai la data della pasqua fornito l'anno, che difficolta' trovi a sommare un giorno?

    Le date sono formattate YYYYMMDD per comodita' di calcolo e confronto, il risultato tu mettilo come ti pare.

    ps: continuo a non capire i tuoi riferimenti ad ambienti e linguaggi diversi da pagina web + javascript, che sono trattati in questa sezione, quali sono le tue reali esigenze?
    Ultima modifica di br1; 08-05-2017 a 20:24
    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
    Buongiorno br1, intanto ti ringrazio per avermi risposto e per la tua disponibilità e pazienza.
    Per quanto riguarda il mio riferimento al VBA era solo per capire se in JS le date dovevano essere formattate in modo rigido o potevo scegliere la formattazione, solo per questo il mio riferimento ad un'altro linguaggio.
    l'esigenza sarebbe di estrapolare da una data di inizio e da una di fine i reali giorni lavorativi, mi spiego meglio il modulo pdf che vorrei andare ad implementare serve per la richiesta dei giustificati e ferie, dove vanno calcolati gli effettivi giorni di lavoro, quindi se io ad esempio inserisco che voglio andare in ferie dal 20/12/2017 al 05/01/2018 il calcolo non deve restituirmi i giorni effettivi che sono 17 (giorno 20/12/2017 compreso) ma bensì 10 giorni perchè deve escludere in automatico sia i sabati e le domeniche che i festivi, per chi lavora su 5 giorni settimanali, 13 giorni effettivi per chi invece lavora su 6 giorni settimanali, variabile questa che potrei andare a determinare nel modulo prima ancora di inserire le date magari con due caselle di controllo da spuntare in caso la settimana lavorativa fosse di 5 o sei giorni.
    qualcosa del tipo :

    codice:
    if check1= true then  
    ecc.. ecc..
    elseif check2=true then
    ecc.. ecc..
    else
    exit sub
    end if
    l'esempio l'ho fatto in VB perchè non conosco la sintassi JS per le condizionali
    Ultima modifica di diego1966; 09-05-2017 a 07:15

  7. #7
    Moderatore di Annunci siti web, Offro lavoro/collaborazione, Cerco lavoro L'avatar di cavicchiandrea
    Registrato dal
    Aug 2001
    Messaggi
    26,132
    Diego credo che riadattare uno script per un profano sia l'approccio peggiore (vedi dubbi ad esempio sulla formattazione della data) considera anche il fatto che il sistema dovrà essere affidabile trattandosi di ferie di dipendenti. Io mi studierei oggetto date e le basi js è una volta capito il funzionamento svilupperei quello che mi serve, tenendo conto che sarà abbastanza impegnativo.
    Non voglio scoraggiarti, ma quello che devi fare è complicato per un esperto.
    Cavicchi Andrea
    Problemi con javascript, jquery, ajax clicca qui

  8. #8
    Quote Originariamente inviata da cavicchiandrea Visualizza il messaggio
    Diego credo che riadattare uno script per un profano sia l'approccio peggiore (vedi dubbi ad esempio sulla formattazione della data) considera anche il fatto che il sistema dovrà essere affidabile trattandosi di ferie di dipendenti. Io mi studierei oggetto date e le basi js è una volta capito il funzionamento svilupperei quello che mi serve, tenendo conto che sarà abbastanza impegnativo.
    Non voglio scoraggiarti, ma quello che devi fare è complicato per un esperto.

    Hai perfettamente ragione Andrea, sono letteralmente asciutto di JS, credevo che le basi di VBA, per quanto diverso come sintassi, mi avrebbero quanto meno aiutato a capire la logica del funzionamento di un linguaggio diverso, ma mi rendo conto che se non si hanno anche le minime basi non è oggettivamente facile cercare di scrivere uno script, credo che dovrò tenermi il modulo incompleto in attesa di capirne di più.

  9. #9
    Quote Originariamente inviata da br1 Visualizza il messaggio
    Confesso, ho cercato di stimolarti perlomeno ad impostare la logica, ma vedo che mi hai sgamato.

    Hai la data della pasqua fornito l'anno, che difficolta' trovi a sommare un giorno?

    Le date sono formattate YYYYMMDD per comodita' di calcolo e confronto, il risultato tu mettilo come ti pare.

    ps: continuo a non capire i tuoi riferimenti ad ambienti e linguaggi diversi da pagina web + javascript, che sono trattati in questa sezione, quali sono le tue reali esigenze?
    @br1, scusami, mi sorge una perplessità su questo pezzo di codice:

    codice:
        qq.setDate(qq.getDate()-1);
        p = (date2str(qq) == date2str(pp));
        // FISSI
        ff = " 0101 0106 0425 0501 0602 0815 1101 1208 1225 1226 "
        // PATRONO
        ff += " 1030 "
    se qq.setDate(qq.getDate()-1); deve restituirmi il giorno di pasquetta perchè dopo gg.getDate() metti -1 ? non dovrebbe essere +1 visto che la pasquetta è successiva alla Pasqua?

    ed inoltre su i festivi comandati, perchè la festa del santo patrono (ff+="1030") la calcoli a parte? non sarebbe più comodo inserirla nel gruppo ff ?

    E' una mia perplessità non conoscendo lo JS magari sto dicendo una fesseria, ma sto cercando di capire e questo pezzo di codice mi ha incuriosito particolarmente.

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.