Newsgroup: it.comp.www.php
Titolo: Giorno della settimana

Avrei bisogno che l'utente inserendo una data qualsiasi in una casella di
text potesse conoscere il giorno della settimana corrispondente. Avevo
trovato una soluzione ma funziona solo con date successive al 1/1/1970.
Grazie

 wrote in message
news:YvcAc.1247$c_1....@twister1.libero.it...

Non ti dice proprio niente quella data???
;)
--
Napolux

 ha scritto nel messaggio
news:YvcAc.1247$c_1....@twister1.libero.it...


 guarda la funzione JDDayOfWeek
[mi quoto]
Per favore quota decentemente.
[/mi quoto]
-- 
I am what I am, I do what I can
L'uomo, conscio di sbagliare, persevera.

 ha scritto nel messaggio
news:sFTAc.5627$GQ3.1...@twister2.libero.it...

Il problema del 1970 e un problema di sistema la funzione che ti avevo
consigliato non risolve perche prende come argomento un timestamp.
Cmq ho risolto il problema con una funzione ad hoc, la ho testata un paio di
volte e dovrebbe andar bene provala sopratutto con gli anni bisestili.
Non mi ero mai posto questo problema, poiche non mi era mai capitato, grazie
tornera utile un giorno
function weekday($day,$month,$year)
{
   $correction_monthly_table=array(0,0,3,3,6,1,4,6,2,5,0,3,5);
$week_table=array("Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Vener
dì","Sabato");
   $cent=intval($year/100);
   $year_2D=$year-$cent*100;
   $FD_cent=(3-($cent-4*intval($cent/4)))*2;
   $FD_year=intval($year_2D/4);
   $FD_month=$correction_monthly_table[$month];
   if(($year-intval($year/4))==0) $leap=true;
   elseif(($year-intval($year/100))==0) $leap=false;
   elseif(($year-intval($year/400))==0) $leap=true;
   else $leap=true;
   $sum_day=$FD_cent+$year_2D+$FD_year+$FD_month+$day;
   if(($month==0||$month==1)&&$leap=0) $sum_day--;
   $wk_day=$sum_day-7*intval($sum_day/7);
   return $week_table[$wk_day];
}

Maicol wrote:

Maicol se vuoi posso crearti una funzione di pochissime righe ed ad alto
risparmio di risorse.. ma non prima di domattina perchè ora devo uscire..
fammi sapere se sei interessato!!!
 
--
www.iuz-lab.info

 La vado a provare grazie

 ha scritto nel messaggio
news:9D3Bc.353284$hc5.15...@news3.tin.it...

Sono molto interessato , grazie ;-P

dimenticavo di dire che quella funzione converte solo date del calendario
gregoriano dal 15 ottobre 1582 e sara valido fino al 4807 piu o meno.
Per maggiori dettagli sul calendario gregoriano
http://en.wikipedia.org/wiki/Gregorian_Calendar
http://en.wikipedia.org/wiki/Calculating_the_day_of_the_week
Inoltre anziche la funzione intval(argomento) potresti usare il cast
(int)(argomento), ottimizza un po l'esecuzione.

 Grazie ancora

Maicol wrote:

function get_day($month, $day, $year){
return(date('l', mktime(0,0,0, $month, $day, 1988 + $year -
floor($year/28)*28)));
}
fai qualche test con questa dovrebbe funzionare bene..
la devi richiamare così 
$day = get_day(mese, giorno, anno);
e dentro $day ci finisce una stringa con scritto che giorno era/sarà/è (in
inglese naturalmente)
--
www.iuz-lab.info

Maicol wrote:

function get_day($month, $day, $year){
return(date('l', mktime(0,0,0, $month, $day, 1988 + $year -
floor($year/28)*28)));
}
fai qualche test con questa dovrebbe funzionare bene.. cmq fammi sapere!!


Grazie la vado a verificare

}
Potresti scriverla come
	$pseudoyear = 1988 + ($year % 28);
	$day	= date('l', mktime(0,0,0, $month, $day, $pseudoyear));
Pero', si vede che questa funzione non fa differenza fra il 2000 ed il
2028, visto che prende l'anno modulo 28. O fra il 1900 e il 1928.
Ma il 1900, essendo divisibile per 100, non e' bisestile; il 1928, che
e' divisibile solo per 4 e non per 100, e' bisestile.
La funzione "sembra" funzionare nell'intorno del Duemila perche' anche
il 2000, che essendo divisibile per 100 dovrebbe non essere bisestile,
e' divisibile per 400 e quindi ritorna bisestile come il 2028.
In sostanza, quella funzione sbaglia fuori dall'intervallo dal 1901 al
2399.
Leonardo SE&O
-- 
Avere studiato senza mettere in pratica e' inutile;
mettere in pratica senza avere studiato e' pericoloso.
                                                - Conphpucio

 Leonardo SE&O
l'ho provata e non mi pare che sbagli..
il ragionamento che ho fatto io è che se consideriamo l'ordine dei giorni
negli anni si nota che c'è un ciclo di 28 anni ripeturo (7 giorni * 4 anni
per via della bisestilità) quindi facendo coincidere l'anno voluto con uno
'compatibile' all'interno del range di date non si hanno problemi
dove i numeri sono i giorni da 1 a 7 pertendo da lunedì(1) e finendo in
domenica(7)
1- 1895 
2- 1896 
4- 1897 
5- 1898 
6- 1899 
7- 1900 
2- 1901 
3- 1902 
4- 1903 
5- 1904 
7- 1905
non mi sembra sia in errore..
 
--
www.iuz-lab.info

la ciclicita e ogni 400 anni e non ogni 28

 la ciclicita e ogni 400 anni e non ogni 28
dimostrami che stò sbagliando..
vedendo la tabella 
http://www.iuz-lab.info/day.php
 non mi sembra.. 
ma di certo senza un controllo approfondito non affermo la sua precisione
assoluta.. va testata..
 
--
www.iuz-lab.info

l'ho provata e non mi pare che sbagli..
Mah, l'ho provata anch'io... e mettiamola cosi': o sbaglio io nel fare
il programma, o si sbaglia il modulo Calendar di PHP, o sbagli tu :-)
Qui sotto un "+" significa che la tua funzione da' lo stesso risultato
delle funzioni JD, mentre "-" significa che il risultato e' diverso.
Incidentalmente, mi sbagliavo anch'io: la tua funzione non sbaglia "al
di fuori dell'intervallo dal 1901 al 2399" perche', gia' nel 2100, non
calcola correttamente l'anno bisestile (il 2100 non e' bisestile).
1700 --------------------------------------------------
1800 --------------------------------------------------
1900 ++++++++++++++++++++++++++++++++++++++++++++++++++
2000 ++++++++++++++++++++++++++++++++++++++++++++++++++
2100 --------------------------------------------------
2200 --------------------------------------------------
2300 --------------------------------------------------
2400 --------------------------------------------------
2500 --------------------------------------------------
       function dow($day, $month, $year)
        {
                $jd     = gregoriantojd ($month, $day, $year);
                $day    = cal_from_jd($jd, CAL_GREGORIAN);
                return $day['dayname'];
        }
        function iuz($day, $month, $year)
        {
                return(date('l', mktime(0,0,0, $month, $day, 1988 + $year
-
                        floor($year/28)*28)));
        }
        for ($year = 1700; $year < 2600; $year += 2)
        {
                $_dow = dow(20, 6, $year);
                $_iuz = iuz(20, 6, $year);
                if (0 == ($year % 100))
                        print "\n$year ";
                print ($_dow == $_iuz) ? '+' : '-';
        }
        print "\n";


Quella funzione va a considerare anche il 29 febbraio 1900 e il 29 febbraio
2100 che non esistono poiche il 1900 anche se divisibile per 4 non e
bisestile poiche e divisibile per 100 e non lo e per 400. Questo fa si che
il calendario sfasa di un giorno. Quella funzione e valida dal 1/3/1900 al
28/2/2100
Cmq verificando la tua mi sono accorto che anche la mia aveva dei problemi.
Includo qui la funzione riformulata
function weekday($month,$day,$year)
{
$correction_monthly_table=array(0,0,3,3,6,1,4,6,2,5,0,3,5);
//$week_table=array("Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Ven
erdì","Sabato");
$week_table=array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday
","Saturday");
$cent=(int)($year/100);
$year_2D=$year%100;
$FD_cent=(3-($cent%4))*2;
$FD_year=(int)($year_2D/4);
$leap=false;
if(($year%4)==0) $leap=true;
if(($year%100)==0) $leap=false;
if(($year%400)==0) $leap=true;
if(($year%4000)==0) $leap=false;
$FD_month=$correction_monthly_table[$month];
if(($leap==true) && ($month==1)) $FD_month=6;
else if(($leap==true) && ($month==2)) $FD_month=2;
else $FD_month=$correction_monthly_table[$month];
$sum_day=$FD_cent+$year_2D+$FD_year+$FD_month+$day;
$wk_day=$sum_day%7;
return $week_table[$wk_day];
}

Scusa Micol la funzione di prima era sbagliata questa dovrebbe essere ok
function weekday($month,$day,$year)
{
$correction_monthly_table=array(0,0,3,3,6,1,4,6,2,5,0,3,5);
$week_table=array("Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Ven
erdì","Sabato");


 
ignoravo molte parti del sistema di calendario gregoriano.. cmq credo di
essere in grado di scrivere una funzione più veloce.. vedrò di farcela
entro domattina
 
--
www.iuz-lab.info

 
--
www.iuz-lab.info


si questa funziona