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

    php calcolo data da numero della settimana

    Buongiorno! Ho il numero di una settimana (calcolata con date('W')) e l'anno a cui mi riferisco. Come faccio a sapere quale è la data del martedì di quella settimana?

    Esiste una funzione per farlo?

  2. #2
    Potresti trovare il primo martedì dell'anno e poi sommargli il numero di settimane per 7.
    Per trovare il primo martedì dell'anno, inizia trovando il numero della settimana del primo dell'anno, poi è semplice matematica.

  3. #3
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Occhio.
    Se il 1° gennaio è mercoledì o giovedì, il primo martedì dell'anno è nella settimana 2.

  4. #4

    Re: php calcolo data da numero della settimana

    Originariamente inviato da diuzza
    Buongiorno! Ho il numero di una settimana (calcolata con date('W')) e l'anno a cui mi riferisco. Come faccio a sapere quale è la data del martedì di quella settimana?

    Esiste una funzione per farlo?
    non so se esiste ma ne ho una che ho adeguato per farti trovare i "martedi'". Se vuoi trovare altri giorni modificala.

    Codice PHP:

    <?php
    // esempio: il martedi' della settimana 15 anno 2008 
    $settimana 15;
    $anno 2008;
    echo 
    "Settimana $settimana - Anno $anno 
    "
    ;

    function 
    TrovaMartedi($settimana$anno) {
     
    // prendi il timestamp di inizio anno
    $start mktime(0,0,011$anno);

    // prendi il n. del giorno nella settimana al 1 gennaio
    $w date('w'$start);

    // calcolo il valore del primo martedi'
    if($w == 0) { $z 3;  }
        elseif(
    $w == 1) { $z 2;  } 
            elseif(
    $w == 2) { $z 1; } 
                else { 
    $z 10 $w; }
              
    // creo un array con associato settimana -> num. giorno dell'anno
    $scelta = array(=> $z);

    // popolo l'array $scelta. sono 53 perche' potrebbero essere 53.
    for($i 1$i <= 53$i++) {
        
    $z += 7;
        
    $scelta[] = $z;
        }

    // calcolo la data
    $data mktime(0,0,01$scelta[$settimana], $anno);

    return 
    date('l, Y-m-d'$data);
    }

    echo 
    TrovaMartedi($settimana$anno);

    ?>

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  5. #5
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Mi pare che questa funzione non tenga conto della mia osservazione

  6. #6
    Utente di HTML.it L'avatar di Luke70
    Registrato dal
    Jul 1999
    Messaggi
    767
    Ipotizzo che se utilizzi date('W') hai anche una data interna a quella settimana che utilizzi come parametro della funzione date.

    Potresti vedere che giorno della settimana è quella data da cui parti e per differenza risalire al martedì.

    Luke

  7. #7
    Non sono sicurissimo dell'affidabilità di queste funzioni perchè non ho avuto modo di fare test approfonditi.

    Codice PHP:
    <?php 

    /*
    * Trova il $day_of_week della $week(esima) settimana a partire dalla data $start
    * Il risultato può essere anche minore di start $start
    */
    function find_day_of_week($start$week$day_of_week 0) {
        
    $wstart date('w'$start); 
        
    $offset $day_of_week $wstart;
        
    $result mktime(0,0,01$offset + ($week 1) * 7);
        return 
    $result;
    }

    /*
    * Trova il $day_of_week della $week(esima) settimana del mese $month/$year
    */
    function find_day_of_month_week($week$month$year$day_of_week 0) {
        
    $start  mktime(000$month1$year);
        
    $wstart date('w'$start); 
        
    $week = ($day_of_week $wstart) ? $week $week;
        return 
    find_day_of_week($start$week$day_of_week);
    }

    /*
    * Trova il $day_of_week della $week(esima) settimana dell'anno $year
    * Non tiene conto del cambio di anno se si tratta dei primi giorni di gennaio
    */
    function find_day_of_year_week($week$year$day_of_week 0) {
        
    $start  mktime(00011$year);
        return 
    find_day_of_week($start$week$day_of_week);
    }

    /*
    * Trova il $day(esimo) $day_of_week della settimana nell'anno $year
    * Tiene conto anche del cambio di anno se si tratta dei primi giorni di gennaio
    * Ad esempio, il 13^ martedi del 2008:
    * $day = find_first_day_of_week(13, 2008, 2);
    */
    function find_first_day_of_week($day$year$day_of_week 0) {
        
    $start  mktime(00011$year);
        
    $wstart date('w'$start); 
        
    $day = ($day_of_week $wstart) ? $day $day;
        return 
    find_day_of_year_week($day$year$day_of_week);
    }

    print(
    '<pre>');

    print(
    'Il 3 Martedi(2) di Ottobre 2008: ');
    $date find_day_of_month_week(31020082);
    print(
    date('d m Y - l'$date));
    print(
    "\r\n");

    print(
    'Il primo(1) lunedi(1) del 2008: ');
    $date find_first_day_of_week(120081);
    print(
    date('d m Y - l'$date));
    print(
    "\r\n");

    print(
    'Il primo(1) martedi(2) del 2008: ');
    $date find_first_day_of_week(120082);
    print(
    date('d m Y - l'$date));
    print(
    "\r\n");

    print(
    '</pre>');

    ?>

  8. #8
    Originariamente inviato da luca200
    Mi pare che questa funzione non tenga conto della mia osservazione
    ne tiene conto, anzi ho corretto quella che avevo proprio in base alla tua osservazione. Poi ho visto che in realta' basta non tener conto della settimana e tutto va. Deve trovare solo qual'e' il primo martedi dell'anno a prescindere dalla settimana e poi associa in un array settimana => giorno dell'anno.

    Ovviamente se serve un'altro giorno della settimana bisogna sistemare lo switch che assegna un valore a $z. Semplice da fare sarebbe una variazione della funzione che tenga conto della scelta del giorno, ma la richiesta era per il martedi' e che martedi' sia.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  9. #9
    Originariamente inviato da luca200
    Occhio.
    Se il 1° gennaio è mercoledì o giovedì, il primo martedì dell'anno è nella settimana 2.
    siccome non parli mai a vuoto.... mi hai fatto venire un dubbio anzi due. Visto che la serata e' uggiosa faccio qualche prova.

    Intanto vorrei precisare che utilizzando quasi esclusivamente mysql per le date mentalmente avevo la presenza di piu' modi di gestire la settimana dell'anno. Il php pare ne abbia uno solo.

    Dato questa premessa, credo di capire che le settimane con il php iniziano sempre di lunedi' e possono essere da 1 a 53. Quindi la funzione che ho postato sopra conta i vari martedi' dell'anno partendo da un indice 1 ad un max di 53 senza tener conto della settimana "W" ma in un mero ordine cronologico. Potrebbe quindi dare risultati inattesi a seconda di come viene iniziato a contare la settimana dell'anno interessato.

    da un controllo con mktime si trovano alcune collisioni a livello settimana-anno.

    esempio:

    sett. 01 2007-01-01 Monday
    sett. 01 2007-12-31 Monday
    sett. 52 2011-01-01 Saturday
    sett. 52 2011-12-31 Saturday

    e poi, l'inizio anno da Monday a Thursday e' sempre sett. 01 mentre
    Friday, Saturday e Sunday sono sempre settimana 52 o 53 dell'anno precedente:

    Sett. 01 2003-01-01 Wednesday
    Sett. 01 2009-01-01 Thursday
    Sett. 53 2010-01-01 Friday
    Sett. 52 2011-01-01 Saturday
    Sett. 52 2012-01-01 Sunday

    Quindi se il mese di gennaio di un qualsiasi anno inizia di Lunedi', martedi', mercoledi', giovedi' sara' la settimana 01 dell'anno corrente, mentre se inzia di venerdi', sabato o domenica questi giorni apparterranno all'ultima settimana dell'anno precedente.

    Dato questo postulato lo switch per la ricerca del martedi' di una qualsiasi settimana dell'anno deve essere rivisto e sostituito con questo che segue:

    Codice PHP:
    // calcolo il valore del martedi' della settimana 01
    if($w == 0) { $z 3;  }                // domenica
       
    elseif($w == 1) { $z 2; }          // lunedi'
          
    elseif($w == 2) { $z 1;  }      // martedi'
            
    elseif($w == 3) { $z = -1; }    // mercoledi'
               
    elseif($w == 4) { $z = -2; } // giovedi
                   
    else { $z 10 $w; }    // venerdi e sabato 
    fermo restando tutto il resto. La collisione possibile di due valori "settimana" identici ad inizio e fine anno con questa funzione non dovrebbe causare equivoci.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  10. #10
    ci sono un paio di errori nello switch usciti debuggando... Posto comunque una versione in condizione di trovare qualsiasi data riferita ad un giorno qualunque della settimana di qualunque anno (leggibile dal unix timestamp).

    Basta introdurre il giorno, la settimana cercata e l'anno. Giorno in italiano e senza accento.

    Codice PHP:
    <?php

    // inserire i dati di prova
    $giorno 'venerdi';
    $settimana 1;
    $anno 2011;

    echo 
    "Giorno $giorno - Settimana $settimana - Anno $anno 
    "
    ;
    // echo date('W Y-m-d l', mktime(0,0,0, 1, 1, $anno))."
    ";

    function TrovaData(
    $giorno$settimana$anno) {

    $w = date('w', mktime(0,0,0, 1, 1, $anno));

    $giorni = array(
            'domenica'  => array( 8, 7, 6,  5,  4, 10,  9),
            'lunedi'    => array( 2, 1, 0, -1, -2,  4,  3), 
            'martedi'   => array( 3, 2, 1,  0, -1,  5,  4),
            'mercoledi' => array( 4, 3, 2,  1,  0,  6,  5),
            'giovedi'   => array( 5, 4, 3,  2,  1,  7,  6),
            'venerdi'   => array( 6, 5, 4,  3,  2,  8,  7),
            'sabato'    => array( 7, 6, 5,  4,  3,  9,  8)
            );

    $z = $giorni[$giorno][$w];
        
    $scelta = array(1 => $z);

    for(
    $i = 1; $i <= 53; $i++) {
        
    $z += 7;
        
    $scelta[] = $z;
        }

    $data = mktime(0,0,0, 1, $scelta[$settimana]$anno);

    return date('l, Y-m-d', 
    $data);
    }

    echo TrovaData(
    $giorno$settimana$anno);

    ?>
    Se qualcuno vuole provare a fondo la matrice sara' il benvenuto....

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

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.