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?
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?
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.
Occhio.
Se il 1° gennaio è mercoledì o giovedì, il primo martedì dell'anno è nella settimana 2.
non so se esiste ma ne ho una che ho adeguato per farti trovare i "martedi'". Se vuoi trovare altri giorni modificala.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?
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,0, 1, 1, $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(1 => $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,0, 1, $scelta[$settimana], $anno);
return date('l, Y-m-d', $data);
}
echo TrovaMartedi($settimana, $anno);
?>
Il silenzio è spesso la cosa migliore. Pensa ... è gratis.
Mi pare che questa funzione non tenga conto della mia osservazione
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
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,0, 1, 1 + $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(0, 0, 0, $month, 1, $year);
$wstart = date('w', $start);
$week = ($day_of_week < $wstart) ? $week + 1 : $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(0, 0, 0, 1, 1, $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(0, 0, 0, 1, 1, $year);
$wstart = date('w', $start);
$day = ($day_of_week < $wstart) ? $day + 1 : $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(3, 10, 2008, 2);
print(date('d m Y - l', $date));
print("\r\n");
print('Il primo(1) lunedi(1) del 2008: ');
$date = find_first_day_of_week(1, 2008, 1);
print(date('d m Y - l', $date));
print("\r\n");
print('Il primo(1) martedi(2) del 2008: ');
$date = find_first_day_of_week(1, 2008, 2);
print(date('d m Y - l', $date));
print("\r\n");
print('</pre>');
?>
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.Originariamente inviato da luca200
Mi pare che questa funzione non tenga conto della mia osservazione
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.
siccome non parli mai a vuoto.... mi hai fatto venire un dubbio anzi due. Visto che la serata e' uggiosa faccio qualche prova.Originariamente inviato da luca200
Occhio.
Se il 1° gennaio è mercoledì o giovedì, il primo martedì dell'anno è nella settimana 2.
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:
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.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
Il silenzio è spesso la cosa migliore. Pensa ... è gratis.
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.
Se qualcuno vuole provare a fondo la matrice sara' il benvenuto....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);
?>
Il silenzio è spesso la cosa migliore. Pensa ... è gratis.