Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    Differenza 'feriale' tra due date

    Ciao, una domandina.

    Devo fare una differenza di giorni feriali tra due date.

    Come faccio a escludere nel conteggio della differenza il sabato e la domenica?

    Attualmente faccio così
    Codice PHP:
    $dataOggi mktime(000getMonth($dataOggi),getDay($dataOggi), getYear($dataOggi));
        
    $thisData mktime(000getMonth($thisData),getDay($thisData), getYear($thisData));
        
        
    // Calcolo la differenza e guarda se ho sforato il tempo di inserimento
        
    $diff=(int)(abs($thisData $dataOggi)/86400); 
    Suggerimenti?

  2. #2
    Utente di HTML.it L'avatar di kodode
    Registrato dal
    Sep 2002
    Messaggi
    1,896
    non so sicuro che si possa fare direttamente...

    io farei un ciclo che parte dalla data di inizio e arriva alla data di fine.
    Per ogni data controlli se è != da sabato e != da domenica, se lo aggiungi un giorno...

    non so se sono stato abbastanza chiaro

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    ci sono vari modi, ma mi piace pensare ad algoritmi matematici, quindi... ecco un esempio

    ...nel tuo caso puoi fare così: memorizzi il giorno della settimana di "partenza" (date('N', ...); e ottieni un valore compreso nell'intervallo 1(lun)-7(dom), chiamiamolo "$w" e poi calcoli:

    $x = (intvall(($diff-1)/7))+1; // numero di settimane (anche parziali)
    $y = ($x-1)*2; // sabati e domeniche delle settimane, esclusa la prima (magari parziale)
    $z = $diff-($x-1)*7; // giorni della prima settimana (eventualmente parziale)

    a questo punto controlli $w e $z: se $z è inferiore a 7 allora la prima settimana è "parziale", in questo caso devi valutare il giorno della settimana di "data partenza + ($z-1) giorni" e hai tre casi:

    aggiungi a $y:
    - 0, se è "meno" di venerdì
    - 1, se è sabato
    - 2, se è domenica o più

    PER ESEMPIO: se $diff è 12 (giorni, cioè 2 settimane, o meglio 1 settimana + 5 giorni) avrai:

    $x = ((12-1) div 7)+1 = (11 div 7)+1 = 1+1 = 2 (settimane complessive, anche se parziali)
    $y = (2-1)*2 = 1*2 = 2 (sabato e domenica delle settimana "completa")
    $z = 12-(2-1)*7 = 12-1*7 = 12-7 = 5 (giorni della settimana parziale)

    ora: vediamo il giorno della settimana di "data partenza + (5-1=4) giorni":
    caso a) se siamo partiti da un lunedì, allora +4 giorni andiamo a venerdì e aggiungeremo 0 (cioè i primi 5 giorni della settimana parziale non comprendono sabato o domenica)
    caso b) se siamo partiti da un martedì, allora +4 giorni andiamo a sabato e aggiungeremo 1 (cioè i primi 5 giorni della settimana parziale comprendono un sabato)
    caso c) se siamo partiti da un mercoledì o oltre, allora +4 giorni andiamo a domernica o oltre e aggiungeremo 2 (cioè i primi 5 giorni della settimana parziale comprendono un sabato e una domenica)

    quindi avremo:
    caso a) 2+0 = 2 (sab & dom), quindi 12gg tot. - 2 = 10 feriali
    caso b) 2+1 = 3 (sab & dom), quindi 12gg tot. - 3 = 9 feriali
    caso c) 2+2 = 4 (sab & dom), quindi 12gg tot. - 2 = 8 feriali

    IL CONCETTO è che calcoli quante settimane intere hai esclusa la prima (che può essere parziale) e quindi vedi se in questi primi giorni hai dentro da aggiungere nulla, un sabato o un sabato e una domenica


    (eh eh... un po' matematico e da verificare... anche se ho fatto qualche controllo, p.es. partendo dal 31Agosto, dal 1Settembre e dal 2Settembre e fila... ma bello simpatico, no?)

  4. #4
    Minchia eiyen!
    Non mi puoi scrivere stà roba di venerdì alle 18!

    Ho seguito il ragionamento fino quasi a metà, ma poi mi son perso
    Forse Lunedì sarò più fresco (sì!... di sbornia! ) e riesco a capirlo tutto.
    E probabilmente me lo sfrutto

    Comunque, il mio scopo è fare un controllo su una differenza di giorni.
    In pratica devo permettere di fare una certa operazione su una certa data, solo se quel giorno è precedente alla data odierna di MASSIMO 'x' giorni.
    E deve essere 'ferialmente' precedente, quindi senza contare domeniche e/o sabati.

    In pratica, se il limite è minore di 7 giorni crea problemi, perché potrebbe limitarmi i giorni in cui posso effettuare l'operazione, avendo l'accesso al portale solo nei giorni feriali.

    Di conseguenza un certo inserimento potrei farlo magari sabato o domenica, quando non c'è nessuno a lavoro.
    Io devo fare in modo che, se il numero di giorni limite non permette almeno due giorni di scarto per effettuare l'operazione, venga saltato il controllo sulla differenza di giorni.
    Altrimenti si esegue normalmente.

    In un delirio fantasioso ho tirato fuori questo, lasciandomi prendere più dall'istinto che dalla logica (davvero! Ho scritto 'a senso'!!! )
    Codice PHP:

    $insert_data 
    formato($thisData); // diventa "WeekDay-Year-Month-Day"

    $num_festivi // sabato + domenica;
    $num_giorni // limite di giorni entro cui effettuare l'operazione

    if( (((int)explode($insert_data)[0] + $num_festivi $num_giorni) % 7) -$num_giorni) )
      return 
    false;
    else
      return((
    $diff $num_giorni); 
    Probabilmente non ha senso.... per voi?

    Comunque lo riguardo lunedì oramai

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    eh eh... lo so che è un cas*** ma era divertente e ci sono modi + semplici (tra l'altro ho fatto una divisione intera e poi calcolato a mano il resto, mentre conviene usare prima l'opreatore "%" e poi calcolare il quoto... oppure le funzioni sui giorni giuliani, vabbè... ma era divertente!)

    In sostanza il mio ragionamento è questo: tu calcoli la differenza in giorni normalmente (includendoli tutti), dopodichè vedi quante settimane hai, p.es.:

    5 gg. = 0 sett. + 5 gg.

    12 gg. = 1 sett. + 5 gg.

    21 gg. = 3 sett. + 0 gg.

    e poi calcoli che il numero di "festivi" è pari a 2*il numero di settimane "intere" a cui devi eventualmente aggiungere un sabato e magari una domenica se sono "compresi" in cui giorni di resto che hai. Tutto qui.

    Le mie formuline le stavo provando e andavano bene devi solo "implementare" la parte sul giorno della settimana iniziale, ma mi pare semplice.

    Altrimenti resta la possibilità del ciclo, soprattutto se la differenza massima che consideri non è indeterminata (p.es. max 12 o 30, ma comunque non anni di differenza...).

    SE PER ESEMPIO devi accettare solo azioni che precedono di massimo un paio di giorni quello attuale ("ferialmente") fai un ciclo all'indietro e controlla il giorno della settimana e basta. Più semplice.

  6. #6
    Grazie Ey

    Allora, ci sto smattando da una giornata. :doh:

    Voglio evitare (per principio ) la soluzione semplice e pesante.
    Ho intenzione di scrivere un codice che permetta la gestione del problema in modo 'agile', a prescindere dalla differenza di giorni (che sì, nel mio caso è di 2/3 giorni ).

    Ora, mi son trovato una funzione 'dateDiff' in PHP. E gli posso dire direttamente di restituirmi il numero di settimane 'intere' tra due date. Molto comodo...

    Il mal di testa me lo fa venire il calcolo dei giorni di contorno, inclusi nelle eventuali due settimane agli estremi!!

    Considera questo 'schemino' sotto. Tra i pipe sono definite le settimane di 7 giorni, con i primi 5 feriali (w=working) e gli ultimi due giorni festivi (h=holiday).
    L'intervallo di date è quello definito tra le lettere W e H; gli underscore sono i giorni non inclusi.
    codice:
    |__Wwwhh|wwwwwhh|wwwwwhh|wwwwwH_|
    In un caso del genere, dove mi calcolo facilmente i 10 giorni feriali delle due settimane intere, come mi trovo una formula che mi calcola i giorni feriali compresi nelle due settimane incomplete agli estremi?

    Sto provando di tutto, ma mi vengono dei troiài assurdi!

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    Con il mio metodo avresti:

    Situazione:
    |__Wwwhh|wwwwwhh|wwwwwhh|wwwwwH_|

    Che sarebbero 25 gg., cioè 3sett.+4gg., visti così:
    |__Wwwh h|wwwwwh h|wwwwwh h|wwwwwH_|

    Facilmente trovi che 25=3*7+4 (con le mie formule di sopra o con: 25%7=4, giorni, e poi (25-4)/7=21/7=3, settimane).

    Quindi - come dicevo - hai certamente 2*numerosettimane=2*3=6 festivi che sarebbero (in maiuscolo)
    |__Wwwh H|wwwwwH H|wwwwwH H|wwwwwH_|

    dopodichè valuti i primi 4gg. che per ora non hai considerato, siccome stai partendo da un mercoledì e finisci con un sabato (che sarebbe mercoledì+(z-1) dove z=4, quindi mercoledì+3=sabato), devi aggiungere 1 (questo sabato appunto) e ottieni:
    1+6=7 festivi

    In pratica il mio "trucco" è di dividere i giorni non nelle settimane "formali", ma in gruppi di 7 giorni (a partire dalla coda, in effetti)

    Semplificando un po' le formule dovresti fare (tra parentesi il rif. al tuo esempio):
    1. calcolo giorni totali (25)
    2. calcolo in giorni+settimane (=4gg + 3sett.)
    3. calcolo del giorno della settimana del primo blocco di giorni (i 4 iniziali: parto da mercoledì e arrivo a sabato in questo caso)
    4. computo finale:
    a. giorni festivi "certi" (numerosettimaneintere*2=3*2=6)
    b. giorni festivi extra nel primo blocco (3 casi: se finisco una domenica aggiungo 2, se finisco un sabato aggiungo 1, se finisco prima aggiungo 0) (qui si finisce di sabato: aggiungo 1)
    c. totale di a+b = 6+1 = 7




    In caso il conteggio del blocco iniziale dia problemi (io ho provato anche casi particolari, p.es. partendo da un sabato, e funzionava, ma magari è saltato qualcosa) fai una semplice scansione solo per quel blocco.

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    a parte le digressioni matematiche - che mi interessano sempre :) - dai un'occhiata anche a http://forum.html.it/forum/showthrea...readid=1048033 dove c'è già qualcosa di pronto considerando anche eventuali giorni festivi "speciali" (tipo Natale, mi pare).

  9. #9
    Grazie mille Eiyen!
    Una buona funzione.

    Scorre i giorni singolarmente, proprio come volevo evitare di fare (), ma almeno mi risolve la grana.

    Però anche a me interessa più dal lato matematico e mi piacerebbe trovare un algoritmo diverso, che non si appoggi ad un ciclo di tutti i singoli giorni. Qualcosa che non risenta, in pesantezza, dell'aumento della differenza tra le date.

    Oramai mi ci son fissato e la voglio fare così

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    potresti usare il mio schema... l'unica cosa che non ho ben verificato è la gestione dei giorni extra (quelli che "avanzano" oltre le settimane intere), per i quali però potresti fare una semplice scansione, visto che comunque sarebbero al massimo 6 iterazioni (quindi "limitate superiormente")... se poi vuoi aggiungere la gestione dei festivi "speciali" si può fare anche con il metodo matematico: alla fine di tutto il calcolo si fa una scansione della lista dei festivi e si contano quelli che cadono nell'intervallo considerato.

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.