Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2002
    Messaggi
    310

    [PHP] - Giorni lavorativi

    Ciao a tutti volevo sapere se esiste una funzione che mi permetta:
    data una data d'inizio e un numero di giorni lavorativi
    di ricavare la data finale (data inizio + giorni lavorativi).

    Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    101
    uhm, sarebbe un po' complicatuccio.. xkè bisogna considerare che la data d'inizio, potrebbe anche essere un giovedì, quindi i calcoli sballerebbero... nn so, ci sarà qualche calcolo complicato da fare a parer mio...

  3. #3
    $data = "15/04/2006";
    $giorni = 35;

    se questi fossero i dati di imput della funzione potresti procedere in questo modo, dando per scontato che i giorni lavorativi li consideri 5 a settimana ma potresti mettere anche un parametro aggiuntivo alla funzione con valore predefinito = a 5

    $settimane = intval($giorni/5);

    quindi con mktime puoi aggiungere il numero di settimane che ti risulta, poi ti manca da sommare

    $giorni_mancanti = $giorni%5;

    e il numero di feste comprese tra la data iniziale e la data trovata con mktime
    per questo devi fare un ciclo che valuta giorno giorno se è una data da considerare valida tenendo presente anche le feste

    ciao

  4. #4
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Ciao. Questa è la mia soluzione. Da premettere che per giorni lavorativi considera solo il sabato e la domenica, non le festività.
    E' un pò contorta ma funzionante.
    Codice PHP:
    <?php
    $dataInizio 
    mktime(0,0,0,4,19,2006);
    $giorni 9;

    $dataFine $dataInizio;
    $i 1;
    while(
    $i<=$giorni )
    {
      
    $data date("w",$dataFine);
      if (
    $data != && $data !=6)
      {
        
    $i++;
      }
    $dataFine $dataFine+86400;
    }
    $dataFine $dataFine-86400;
    echo 
    date("d-m-Y",$dataFine);
    ?>

  5. #5
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    edit: avevo postato una funzione dal manuale ufficiale ma non generava il risultato che volevi. Appena posso lo guardo con calma. Per adesso accontentati.

  6. #6
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Ciao. Questo è il mio script per il tuo problema. Restituisce la data finale data quella di partenza e il numero di giorni lavorativi. Tiene conto delle festività. Ho fatto un pò di prove e mi sembra funzioni correttamente.
    Sicuramente si può scrivere meglio quindi sono ben accetti consigli.

    Codice PHP:
    <?php
    // Calcolo del giorno di Pasqua fino all'ultimo anno valido
    for ($i=2006$i<=2037$i++)
    {
    $pasqua date("Y-m-d"easter_date($i));
    $array_pasqua[] = $pasqua;
    }
    //var_dump($array_pasqua);

    // Calcolo le rispettive pasquette
    foreach($array_pasqua as $pasqua)
    {
    list (
    $anno,$mese,$giorno) = explode("-",$pasqua);
    $pasquetta mktime (0,0,0,date($mese),date($giorno)+1,date($anno));
    $array_pasquetta[] = $pasquetta;
    }

    // Data da cui calcolare i giorni lavorativi
    $giorno 8;
    $mese 12;
    $anno 2006;

    // Numero giorni lavorativi
    $lavorativi 15

    // Mi calcolo il timestamp della mia data di partenza
    $tsData mktime(0,0,0,$mese,$giorno,$anno);

    // questi giorni son sempre festivi a prescindere dall'anno
    $giorniFestivi = array("01-01",
                           
    "01-06",
                           
    "04-25",
                           
    "05-01",
    "06-02",
                           
    "08-15",
                           
    "11-01",
                           
    "12-08",
                           
    "12-25",
                           
    "12-26",
                           );

    $i 0;
    while (
    $i<$lavorativi)
    {
      
    $giorno_data date("w",$tsData); //verifico il giorno: da 0 (dom) a 6 (sab)
      
    $mese_giorno date('m-d',$tsData); // confronto con gg sempre festivi
    // Infine verifico che il giorno non sia sabato,domenica,festivo fisso o festivo variabile (pasquetta);        
      
    if ($giorno_data !=&& $giorno_data != && !in_array($mese_giorno,$giorniFestivi) && !in_array($tsData,$array_pasquetta) )
      {
        
    $i++;
      }
    $tsData=$tsData+86400;
    }
    $tsData=$tsData-86400;
    $giorno_conclusivo date('d-m-Y',$tsData);
    echo 
    $giorno_conclusivo;
    ?>

  7. #7
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Hai dimenticato il 2 giugno

  8. #8
    Utente di HTML.it L'avatar di nicola75ss
    Registrato dal
    Nov 2004
    Messaggi
    12,923
    Originariamente inviato da luca200
    Hai dimenticato il 2 giugno
    Ops. E' vero.
    Ora provvedo.

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2006
    Messaggi
    324
    ...e se per esempio io volessi attribuire ai sabati mezza giornata lavorativa?

    :master:
    Ho la sindrome di Peter Pan, le manie di persecuzione...se sapessi suonare uno strumento sicuramente avrei anche un complesso.

  10. #10
    Utente di HTML.it L'avatar di dottwatson
    Registrato dal
    Feb 2007
    Messaggi
    3,012
    questo il mio contributo....
    puoi estrarre le ore, il totale dei giorni e relative date, nonchè le date festive

    accetta le date in formato italiano (gg-mm-aaaa) e le restiotuisce in italiano..

    nel caso in cui volessi sapere, ad esempio la data di fine conoscendo il numero dei giorni e la data di partenza (esempio stima dell' apertura di un cantiere)
    Codice PHP:
    $my_giorni=200;
    $myinizio ='12-02-2009';
    // diamoci una data superiore ai giorni lavorativi giusto per starci dentro
    $myfine   ='12-02-2010';

    $date_termine=lavorativi($myinizio,$myfine,'date');
    $data_finale=$date_termine[$my_giorni];
    echo 
    $data_finale."
    "



    Codice PHP:
    <?php
    $myinizio
    ='2-3-2008';
    $myfine='2-3-2009';


    $ore_lavorative     lavorativi($myinizio,$myfine,'ore');
    $giorni_lavorativi  lavorativi($myinizio,$myfine,'giorni');
    $date_lavorative    lavorativi($myinizio,$myfine,'date');
    $feste              lavorativi($myinizio,$myfine,'festivita');


    echo 
    "le ore lavorative sono $ore_lavorative
    "
    ;
    echo 
    "i giorni lavorativi sono $giorni_lavorativi
    "
    ;
    echo 
    "elenco festivit&agrave;
    "
    ;
    echo 
    "<pre>";
    print_r($feste);


    echo 
    "elenco date
    "
    ;
    echo 
    "<pre>";
    print_r($date_lavorative);


    function 
    lavorativi($from,$to,$cosa)
      {
      
    $ore=0;
      
    $giorni=0;
      
    $date=array();
      
    $festivita=array();
      
    //giorno della settimana => ore lavorative
      
    $lavorativi =  array(1=>8,2=>8,3=>8,4=>8,5=>8,6=>4,7=>0);
      
      
    $festivi=array(
                     
    "01-01",
                     
    "06-01",
                     
    "25-04",
                     
    "08-05",
                     
    "02-06",
                     
    "15-08",
                     
    "01-11",
                     
    "08-12",
                     
    "24-12",
                     
    "25-12",
                     
    "26-12",
                     ); 
      
      list(
    $d_start,$m_start,$y_start)=explode('-',$from);
      list(
    $d_stop,$m_stop,$y_stop)=explode('-',$to);  
      
      
    $start=strtotime("$y_start-$m_start-$d_start");
      
    $stop=strtotime("$y_stop-$m_stop-$d_stop");
      
      
      
    $day=$start;
      while(
    $day <= $stop)
        {
        list(
    $day_of_week,
             
    $ita_date,
             
    $confronto_festivo,
             
    $giorno_pasquale)=explode('__',date('N__d-m-Y__d-m__Y',$day));

        if ( (
    $day_of_week != 7) && !in_array($confronto_festivo,$festivi) && $day != easter_date($giorno_pasquale) )
          {
          
    $ore+=$lavorativi[$day_of_week];
          
    $giorni++;
          
    $date[]=$ita_date;
          }
        else
          {
          
    $festivita[]=$ita_date;
          }
        
    $day+=86400;
        }
      
      return $
    $cosa;
      }
    ?>
    Non sempre essere l'ultimo è un male... almeno non devi guardarti le spalle

    il mio profilo su PHPClasses e il mio blog laboweb

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.