[risolto] quante settimane ci sono in un anno

  • Creatore Discussione Creatore Discussione colomber
  • Data di inizio Data di inizio
puoi prendere spunto da questo codice
si riferisce ad un solo mese ma dovresti essere in grado di modificarlo
 
ciao
prova questa
PHP:
<?php
function settimane($num_set=1,$anno){
	$settimana=$num_set-1;
	$primo_anno=mktime(0,0,0,1,1,2013);//di che girno cade il 1° dell'anno
	$num_gg_anno=date("w", $primo_anno)-1;//giorni da togliere
	$partenza=$primo_anno-$num_gg_anno*(24*60*60);//lunedi della prima settimana dell'anno
	$primo_giorno=$partenza+$settimana*7*24*60*60;
	$ultimo_giorno=$primo_giorno+6*24*60*60;
	//sin qui le date sono tutte in timestamp
	$mese=array("","gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic");
	$set[0]=date("d", $primo_giorno)."/".$mese[date("n",$primo_giorno)]."/".date("Y",$primo_giorno);
	$set[1]=date("d", $ultimo_giorno)."/".$mese[date("n",$ultimo_giorno)]."/".date("Y",$ultimo_giorno);
	return $set;
}
//****test*****
for($k=1;$k<53;$k++){
	$vedi=settimane($k,2013);
	echo "sett. $k va dal ".$vedi[0]." al ".$vedi[1]."<br />";
}
?>
ho messo tutti i passaggi, ma forse si può condensare
provala anche per altri anni
 
funziona però c'é un problema che ritroviamo nell'anno 2015 da wikipedia:


Secondo lo standard internazionale ISO 8601, in un anno sono presenti 52 o 53 settimane.
La settimana 01 dell'anno è la prima settimana che contiene quattro o più giorni del nuovo anno.

Può essere anche equivalentemente definita come:

la settimana che contiene il primo giovedì dell'anno;
la settimana che contiene il 4 gennaio;
la settimana che inizia con il lunedì fra il 29 dicembre ed il 4 gennaio.

Ne deriva che se il 1º gennaio è un lunedì, martedì, mercoledì o giovedì allora è nella settimana 01. Se è un venerdì, sabato o domenica allora appartiene all'ultima settimana (52ª o 53ª) dell'anno precedente.



e per mettere la data in questo formato?

sett. 13 va dal 21/mar/2016 al 27/mar/2016 ----> sett. 13 va dal 21 marzo 2016 al 27 marzo 2016
 
ciao
alla prima osservazione devo guardare e si devono eventualmente fare degli if in funzione di quello che hai detto
cioè verificare quanti e quali gg cadono in nell'anno.
per la seconda è più semplice
1) modifichi la riga dell'array (non la scrivo tutta) da
PHP:
$mese=array("","gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic");

in
PHP:
$mese=array("","gennaio","febbraio","mar","apr","mag","giu","lug","ago","set","ott","nov","dic");

2) modifichi le righe dell'output (ne metto solo una, l'altra è uguale)
da
PHP:
$set[0]=date("d", $primo_giorno)."/".$mese[date("n",$primo_giorno)]."/".date("Y",$primo_giorno);

in
PHP:
$set[0]=date("d", $primo_giorno)." ".$mese[date("n",$primo_giorno)]." ".date("Y",$primo_giorno);

cioè al posto dello slash metti uno spazio
 
ciao
prova così, a te la verifica se risulta come il link che hai postato
PHP:
<?php
function settimane($num_set=1,$anno){
	$settimana=$num_set-1;
	$primo_anno=mktime(0,0,0,1,1,$anno);//di che girno cade il 1° dell'anno
	$set_primo=date("W", $primo_anno);//in che settimana cade 01 o 52 o 53 (se 52 o 53 anno precedente)
	$togli_aggiungi=1;
	if((int)$set_primo >1){//è 52 o 53
		$togli_aggiungi=-1;
	}
	$num_gg_anno=$togli_aggiungi*(date("w", $primo_anno)-1);//giorni da togliere o aggiungere
	$partenza=$primo_anno-$num_gg_anno*(24*60*60);//lunedi della prima settimana dell'anno
	$primo_giorno=$partenza+$settimana*7*24*60*60;
	$ultimo_giorno=$primo_giorno+6*24*60*60;
	//sin qui le date sono tutte in timestamp
	$mese=array("","gennaio","febbreaio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","diccembre");
	$set[0]=date("d", $primo_giorno)." ".$mese[date("n",$primo_giorno)]." ".date("Y",$primo_giorno);
	$set[1]=date("d", $ultimo_giorno)." ".$mese[date("n",$ultimo_giorno)]." ".date("Y",$ultimo_giorno);
	return $set;
}
//******test******
$a=2016;
for($k=1;$k<53;$k++){
	$vedi=settimane($k,$a);
	echo "sett. $k va dal ".$vedi[0]." al ".$vedi[1]."<br />";
}
?>
se va bene o se devo cambiare qualcosa dimmelo
 
C'é un'errore

visto che la prima settimana del 2016 dura meno di 4 giorni (Domenica é il 3 gennaio) questa settimana diventa la 53° del 2015, inizia il 28 dicembre 2015 e finisce il 3 gennaio 2016.
 
ciao
dovrebbe essere a posto
PHP:
<?php
function settimane($num_set,$anno){
	$s=$num_set-1;
	/*settimana ISO 8601
	se 1° gennaio = lunedì, martedì, mercoledì o giovedì sono nella 1° dell'anno
	se 1° gennaio = venerdì, sabato o domenica sono nell'ultima settimana dell'anno precedente
	*/
	/*calcolo che giorno è il 1° gennaio
	0= dom
	1= lun
	2= mar
	3= mer
	4= gio
	5= ven
	6= sab
	*/
	$primo_anno=mktime(0,0,0,1,1,$anno);//timestamp del primo giorno
	$primo_giorno=date("w", $primo_anno);//da 0 a 6
	$set[2]=52;//numero normale di settimane in un anno
	//verifico se per giovedì
	if($primo_giorno==4){
		$set[2]=53;
	}
	//se bisestile  di mercoledì
	//verificho se bisestile e se inizia di mercoledì
	if(checkdate(2,29,$anno) && $primo_giorno==3){//se non è bisestile checkdate = FALSE
		$set[2]=53;
	}
	switch($primo_giorno){
		case 1: $delta= -0*(24*60*60); break;
		case 2: $delta= -1*(24*60*60); break;
		case 3: $delta= -2*(24*60*60); break;
		case 4: $delta= -3*(24*60*60); break;
		case 5: $delta= 3*(24*60*60); break;
		case 6: $delta= 2*(24*60*60); break;
		case 0: $delta= 1*(24*60*60); break;
	}
	$primo_gg_set=($s*7*24*60*60)+$primo_anno+$delta;
	$ultimo_gg_set=$primo_gg_set+(6*24*60*60);
	$mese=array("","gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre");
	$set[0]=date("d", $primo_gg_set)." ".$mese[date("n",$primo_gg_set)]." ".date("Y",$primo_gg_set);
	$set[1]=date("d", $ultimo_gg_set)." ".$mese[date("n",$ultimo_gg_set)]." ".date("Y",$ultimo_gg_set);
	return $set;
}//fine function
//*********TEST************
$a=2013;//se provi il 2020 vedi che le settimane risultano 53
$num_set=52;
for($k=1; $k <=$num_set;$k++){
	$vedi=settimane($k,$a);
	$num_set=$vedi[2];
	echo "anno $a: $k ° settimana va dal ".$vedi[0]." al ".$vedi[1]."<br />";
}
?>
come al solito fai delle prove e avvisami
 

Discussioni simili