Newsgroup: it.comp.www.php
Titolo: [CHICCA]: calcolo della Pasqua

ho effettuato un doloroso "porting" (per via della complessità dei calcoli) 
della funzione di calcolo della Pasqua nel calendario gregoriano, da VBA in 
PHP.
vale per tutte le Pasque dal 1583 in avanti.
sperando che gradiate...
<?
$a=$anno%19;
$b=floor($anno/100);
$c=$anno%100;
$p=(19*$a+$b-(floor($b/4))-(floor(($b-(floor(($b+8)/25))+1)/3))+15)%30;
$q=(32+2*(($b%4)+(floor($c/4)))-$p-($c%4))%7;
$r=($p+$q-7*(floor(($a+11*$p+22*$q)/451))+114);
$mese=floor($r/31);
$giorno=(($r%31)+1);
print "$anno/$mese/$giorno";
?>
ciao

 |
| Delete WORLD to reply        |
|                              |
| Software is like sex...      |
| It's better when it's free.  |
+------------------------------+

 PHP.
La regola per calcolare la pasqua qual'è? in italiano, intendo...
LAMASE

Il giorno di Pasqua cade sempre nella prima domenica dopo il primo
plenilunio di primavera.
La ricorrenza è stata stabilita dal concilio ecclesiastico del 325.


 sperando che gradiate...
... la citazione dell'autore, almeno ...
Bye
	gpb
-- 
http://gpbizzaro.supereva.it/index.html


La regola è quella che ti hanno già postato, l'algoritmo è di gauss
e trovi ampia spiegazione qui:
http://gpbizzaro.supereva.it/Pasqua.html
unitamente al MIO codice.
gpb
-- 
http://gpbizzaro.supereva.it/index.html

Ah, se non bastasse qui si sono alcuni link:
http://www.google.it/search?q=%22g.paolo+bizzaro%22+pasqua&hl=it&lr=
gpb
-- 
http://gpbizzaro.supereva.it/index.html


Dai...mica poteva immaginare che l'autore lurkasse questo
NG:)))
A parte gli scherzi, credo che se due persone fanno
riferimento alla stessa documentazione per effettuare
un'implementazione di un algoritmo, molto probabilmente lo
spazio dei nomi dele variabili sarà lo stesso.
-- 
WEbdOM webmaster di
Metronic.It mobile phone philosophy

 Metronic.It mobile phone philosophy
-- 
attenzione: indirizzo alterato antispam
http://gpbizzaro.supereva.it/index.html

 spazio dei nomi dele variabili sarà lo stesso.
scusate, ma purtroppo quello è un *doloroso*  "cut and paste".
--
CIAO!
Gusher

 scusate, ma purtroppo quello è un *doloroso*  "cut and paste".
il codice che ho postato è stato tradotto dalla versione VB:
"Public Function Pasqua(Anno As Integer) As Date
..."
facendo una traduzione 1 a 1 solo uno scemo non arriverebbe a scrivere il 
codice ESATTAMENTE come va scritto in PHP, e cioè come l'ho scritto io e 
come l'aveva già scritto Bizzarro mesi fa (ma io ignoravo che avessa già 
scritto la versione PHP).
quello che è stato frainteso, è che io non ho cercato di prendermi il 
merito del codice (chi mi conosce sa che io riporto anche codici già noti e 
quello che produco io, lo distribuisco senza licenze o limiti né senza 
allegare il mio nome per prendermene il merito, visto che lo faccio per il 
gusto di scriverlo)
l'errore che ho fatto è stato di non specificare APERTAMENTE il nome 
dell'autore e la sorgente da cui ho acquisito i dati.
il motivo primo che mi ha spinto a postare QUEL codice era che IO ho 
sbattuto la testa un po' prima di trovare la funzione (e l'ho trovata solo 
in VB). sperando di non far fare la stessa traduzione a qualcun altro, come 
frequentatore nel NG mi sono sentito in dovere di postarlo.
evidentemente non è così e andrebbero postati SOLO i propri lavori e solo 
se richiesto espressamente da qualcuno... magari allegandoci un bel file 
con specificata la licenza...
in questo caso di miei post ce ne sarebbero ben pochi e anche questo NG 
sarebbe MOLTO MENO FREQUENTATO.
(allora quella bella funzione di ereg_replace trasportata per essere  
eseguibile da postgres non l'avrei mai avuta, sigh!)
scusate il disagio
:-(

eseguibile da postgres non l'avrei mai avuta, sigh!)
Una bella funzione datefmt(varchar, datetime) con la stessa sintassi
di date() in PHP interessa? (in C)
Il prossimo doloroso parto sara' il modo, in PostgreSQL, di fare
	INSERT REPLACE (x, y, z, k) INTO tabella WHERE condition;
dove se la tupla non esiste la inserisce, se esiste la aggiorna :-)
Leonardo

 dove se la tupla non esiste la inserisce, se esiste la aggiorna :-)
fai sapere!
grande!
ciao

 scritto la versione PHP).
errato: "Bizzarro" -> corretta: "Bizzaro" (con l'accento sulla I)


fai sapere!
Per ora ho trovato solo sistemi costosi :-( ... il sistema economico in
realta' c'e', ma significherebbe mettere le mani *DENTRO* il backend, e
non mi sento tranquillo :-)
Leonardo

 errato: "Bizzarro" -> corretta: "Bizzaro" (con l'accento sulla I)
oooops!!
scusa!
ciao

 scritto la versione PHP).
anch'io ne ho scritta una mesi fa con tanto di calcolo dei giorni festivi.
se la trovo domani la posto dall'ufficio.

 se la trovo domani la posto dall'ufficio.
Per evitare altri equivoci :-) non postarla uguale a quella qui sotto.
Bye
	gpb
 
<?php
function RicorrenzeReligiose ($anno)
{
  // da modificare a piacimento
     $PatronoDay = "0113" ; $Patrono = "Sant'Ilario (patrono di Parma)" ;    // 13 gennaio
  // $PatronoDay = "1209" ; $Patrono = "Sant'Ambrogio (patrono di Milano)" ; // 9 dicembre
  $SecDay = 86400 ; // numero di secondi in un giorno
  $anno4 = sprintf("%04d",$anno) ;
  $festa = array() ;
  // Pasqua & company
  $a = $anno % 19 ; $b = floor( $anno / 100) ; $c = $anno % 100 ;
  $p = (19 * $a + $b - floor( $b / 4 ) - floor( ($b - floor( ($b + 8) / 25) + 1) / 3) + 15) % 30 ;
  $q = (32 + 2 * (($b % 4) + floor( $c / 4 ) ) - $p - ($c % 4)) % 7 ;
  $r = $p + $q - 7 * ( floor( ($a + 11 * $p + 22 * $q) / 451)) + 114 ;
  // mese : floor($r/31) , giorno: $r%31+1
  $unixPasqua = mktime ( 12 , 0 , 0 , floor($r/31) , $r%31+1 , $anno ) ;   // (hour,minute,second,month,day,year)
  $festa [ strftime("%m%d",$unixPasqua-46*$SecDay) ] = "Le Ceneri" ;
  $festa [ strftime("%m%d",$unixPasqua-42*$SecDay) ] = "1ª Quaresima" ;
  $festa [ strftime("%m%d",$unixPasqua-35*$SecDay) ] = "2ª Quaresima" ;       //  P-35
  $festa [ strftime("%m%d",$unixPasqua-28*$SecDay) ] = "3ª Quaresima" ;       //  P-28
  $festa [ strftime("%m%d",$unixPasqua-21*$SecDay) ] = "4ª Quaresima" ;       //  P-21
  $festa [ strftime("%m%d",$unixPasqua-14*$SecDay) ] = "5ª Quaresima" ;       //  P-14
  $festa [ strftime("%m%d",$unixPasqua-7*$SecDay) ]  = "Le Palme" ;           //  P-7
  $festa [ strftime("%m%d",$unixPasqua) ]            = "Pasqua" ;
  $festa [ strftime("%m%d",$unixPasqua+$SecDay) ]    = "Lunedì dell'Angelo" ; // P+1
  $festa [ strftime("%Y%m%d",$unixPasqua+$SecDay) ] = 1 ;  // non lavorativo
  $festa [ strftime("%m%d",$unixPasqua+7*$SecDay) ]  = "2ª Domenica di Pasqua (in Albis)" ;
  $festa [ strftime("%m%d",$unixPasqua+14*$SecDay) ] = "3ª Domenica di Pasqua" ;
  $festa [ strftime("%m%d",$unixPasqua+21*$SecDay) ] = "4ª Domenica di Pasqua" ;
  $festa [ strftime("%m%d",$unixPasqua+28*$SecDay) ] = "5ª Domenica di Pasqua" ;
  $festa [ strftime("%m%d",$unixPasqua+35*$SecDay) ] = "6ª Domenica di Pasqua" ;
  $festa [ strftime("%m%d",$unixPasqua+42*$SecDay) ] = "Ascensione" ;         // (40?)
  $festa [ strftime("%m%d",$unixPasqua+49*$SecDay) ] = "Pentecoste" ;         //
  $festa [ strftime("%m%d",$unixPasqua+56*$SecDay) ] = "SS.Trinità" ;         //
  $festa [ strftime("%m%d",$unixPasqua+63*$SecDay) ] = "Corpus Domini" ;      // (60?)
  // Natale & company
  $unixNatale = mktime ( 12 , 0 , 0 , 12 , 25 , $anno ) ;   // (hour,minute,second,month,day,year)
  $weekdayNatale = strftime("%w", $unixNatale )+0 ; // giorno della settimana in cui cade il Natale (0 dom ... 6 sab)
  $unixUltimaAvvento = $unixNatale - $SecDay * ( ( ( $weekdayNatale + 6 ) % 7 ) + 1 )  ;
  $festa [ strftime("%m%d",$unixUltimaAvvento-28*$SecDay) ] = "Cristo Re" ;
  $festa [ strftime("%m%d",$unixUltimaAvvento-21*$SecDay) ] = "1ª Avvento" ;
  $festa [ strftime("%m%d",$unixUltimaAvvento-14*$SecDay) ] = "2ª Avvento" ;
  $festa [ strftime("%m%d",$unixUltimaAvvento-7*$SecDay) ]  = "3ª Avvento" ;
  $festa [ strftime("%m%d",$unixUltimaAvvento) ]            = "4ª Avvento" ;
  $festa [ strftime("%m%d",$unixUltimaAvvento+7*$SecDay) ]  = "Sacra Famiglia" ;
  // festivi infrasettimanali fissi non lavorativi
  $festa [ "0101" ] = "Santa Madre di Dio" ;
  $festa [ $anno4 . "0101" ] = 1 ;
  $festa [ "0106" ] = "Epifania" ;
  $festa [ $anno4 . "0106" ] = 1 ;
  $festa [ "0815" ] = "Assunzione B.V.Maria" ;
  $festa [ $anno4 . "0815" ] = 1 ;
  $festa [ "1101" ] = "Tutti i Santi" ;
  $festa [ $anno4 . "1101" ] = 1 ;
  $festa [ "1102" ] = "Commemorazione dei defunti" ;
  // modificata perché potrebbe coincidere con la 2ª domenica di avvento
  $festa [ "1208" ] = "Immacolata Concezione di M.V." . ( isset($festa["1208"]) ? " / "  . $festa["1208"] : "" ) ;
  $festa [ $anno4 . "1208" ] = 1 ;
  // modificata perché potrebbe coincidere con la Sacra Famiglia
  $festa [ "1225" ] = "Natale di Gesù" . ( isset($festa["1225"]) ? ( " / " . $festa["1225"] ) : "" ) ;
  $festa [ $anno4 . "1225" ] = 1 ;
  // modificata perché potrebbe coincidere con la Sacra Famiglia
  $festa [ "1226" ] = "Santo Stefano" . ( isset($festa["1226"]) ? ( " / " . $festa["1226"] ) : "" ) ;
  $festa [ $anno4 . "1226" ] = 1 ;
  $festa [ "1002" ] = "Festa degli Angeli Custodi" ;
  // ed eventualmente le altre non esattamente dei "santi": 25 marzo Annunciazione, ecc
  // ricorrenze mensili particolari (primi venerdì e sabati, Medjugorje)
  for ( $mese = 1 ; $mese <= 12 ; $mese++ )
  {
    $unixPrimo = mktime ( 12 , 0 , 0 , $mese , 1 , $anno ) ;   // (hour,minute,second,month,day,year)
    $weekPrimo = strftime("%w", $unixPrimo )+0 ;
    $primoVen = strftime ( "%m%d", $unixPrimo + ( (12-$weekPrimo) % 7 ) * $SecDay ) ;
    $primoSab = strftime ( "%m%d", $unixPrimo + ( (13-$weekPrimo) % 7 ) * $SecDay ) ;
    $festa [ $primoVen ] = ( $festa [ $primoVen ] ? $festa [ $primoVen ] . " / " : "" ) . "primo venerdì del mese" ;
    $festa [ $primoSab ] = ( $festa [ $primoSab ] ? $festa [ $primoSab ] . " / " : "" ) . "primo sabato del mese" ;
    // se interessano i messaggi di Medjugorje (ogni 25 del mese)
    // $day = sprintf("%02d25",$mese) ;
    // $festa [ $day ] = ( isset($festa[$day]) ? $festa[$day] . " / " : "" ) . "messaggio Medjugorje" ;
  }
  // patrono
  if (isset($PatronoDay))
  {
    $festa [ $PatronoDay ] = ( $festa [ $PatronoDay ] ? $festa [ $PatronoDay ] . " / " : "" ) . $Patrono ;
    $festa [ $anno4 . $PatronoDay ] = 1 ;
  }
  return $festa ;
}
function RicorrenzeLaiche ($anno)
{
  $anno4 = sprintf("%04d",$anno) ;
  $festa [ "0501" ] = "Festa dei lavoratori" ;      $festa [ $anno4 . "0501" ] = 1 ;
  $festa [ "0425" ] = "Festa della liberazione" ;   $festa [ $anno4 . "0425" ] = 1 ;
  $festa [ "0602" ] = "Festa della Repubblica" ;
  $festa [ "1104" ] = "Festa delle Forze Armate" ;
  return $festa ;
}
  // TEST FUNZIONI
  $myAnno = $HTTP_GET_VARS["anno"]+0 ;
  if ( $myAnno<100 )
  {
    $myAnno = date("Y",time())+0;
  }
  print "<html><head><title>Calendario $myAnno</title></head><body bgcolor=\"#c0c0c0\">" ;
  setlocale(LC_TIME,"it_IT");
  $unixPrimo  = mktime ( 12 , 0 , 0 , 1 , 1 , $myAnno ) ;
  $unixUltimo = mktime ( 12 , 0 , 0 , 12 , 31 , $myAnno ) ;
  $FesteR = RicorrenzeReligiose($myAnno) ;
  $FesteL = RicorrenzeLaiche($myAnno) ;
  print("<table border width=100%><caption align=top><b>Calendario $myAnno</b></caption>");
  for ( $mese = 1 ; $mese <= 12 ; $mese++ )
  {
    for ( $giorno = 1 ; $giorno <= 31 ; $giorno++)
    {
      if (checkdate($mese,$giorno,$myAnno))
      {
        $datacorrente    = mktime (12,0,0,$mese,$giorno,$myAnno) ;
        $giornosettimana = strftime("%w",$datacorrente)+0 ;       // giorno della settimana
        $datalarga       = strftime("%Y%m%d",$datacorrente) ;   // pacco YYYYmmdd
        $datastretta     = strftime("%m%d",$datacorrente) ;     // pacco mmdd
        $datastampa      = strftime("%a&nbsp;%d&nbsp;%b&nbsp;%Y",$datacorrente);  // es. "dom 17 dicembre 2001"
        $scrittaFesteR = $FesteR[ $datastretta ] ;
        if ($scrittaFesteR) $scrittaFesteR = "<font color=indigo><i>" . $scrittaFesteR . "</i></font><br>" ;
        $scrittaFesteL = $FesteL[ $datastretta ] ;
        if ($scrittaFesteL) $scrittaFesteL = "<i>" . $scrittaFesteL . "</i><br>" ;
        $festivo =  ( ($giornosettimana == 0) || ($FesteR[$datalarga]==1) || ($FesteL[$datalarga]==1) ) ? 1 : 0 ;
        // ------ scritta finale ------
        $scritta = $scrittaFesteR . $scrittaFesteL ;
        print "<tr><td align=center width=10% valign=top>"
          . ( $festivo ? "<font color=blue><b>" . $datastampa . "</b></font>" : $datastampa )
          . "</td>"
          . "<td valign=top>" . ($scritta ? $scritta : "&nbsp;" ) . "</td></tr>" ;
      }
    }
  }
  print("</table>");
  print "</body></html>" ;
?>
