Håller på att göra en kalender där man ska kunna spara "events".
Eftersom den ska rikta sig till svenska användare tänkte jag försöka ordna så att även svenska helgdagar skrivs ut med röd text (precis som lördag/söndag, som jag har det nu). Vissa helgdagar infaller ju tex en torsdag.
Vart kan man få tag på alla svenska helgdagar och hur gör jag enklast för att kolla om en månads dag är en helgdag ?
Kalender och helgdagar
8 svar · 651 visningar · startad av Virrdo
Du hittar dem i de flesta almanackor som finns på marknaden.
Men hur ska jag göra att få ihop dem med respektive dag ? Alla helgdagar infaller ju inte heller på samma dag varje år.
Det finns regler för de allra flesta men en svensk almenacka kan inte automatgenereras vad jag vet.
Du måste skaffa dig ett underlag
Kolla hur Outlook´s kalenderfiler är uppbyggda.
På något sätt finns det ju ett samband mellan alla, men det är ju olika samband för olika dagar så du kan inte göra en funktion
Men på http://www.fidonet.pp.se/almanacka.php3 har de uppenbarligen lyckats, så det kan ju inte vara helt omöjligt. Får väl maila dem och se om jag får någe svar.
Enklast att fixa detta vore väl att lägga årets "udda" helgdagar i en array och sedan jämföra datumet med dem i arrayen. Finns det där, så ska dagen vara röd.
Det var lite roligt med helgdagar ;) Jag har skrivit ett script som du gärna får prova som hittar "udda" helgdagar, dvs "vanliga" söndagar får du finna själv, det är ju inte så svårt.
Lite kul är att det finns en "formel" för att beräka datumet för påskdagen (hittade på nätet, och omskiven i PHP i funktionen getEaster()). Baserat på detta datum är det enkelt att bestämma övriga helger.
<?
function getEaster($year){
// Algoritm för att hitta påskdagen från boken
// "Explanatory Supplement to the Astronomical Almanac", P. Kenneth Seidelmann (red.)
// som finns på [url]http://astro.nmsu.edu/~lhuber/leaphist.html[/url]
$C = floor($year/100);
$N = $year - 19*floor($year/19);
$K = floor(($C - 17)/25);
$I = $C - floor($C/4) - floor(($C - $K)/3) + 19*$N + 15;
$I = $I - 30*floor($I/30);
$I = $I - floor($I/28)*(1 - floor($I/28)*floor(29/($I + 1))*floor((21 - $N)/11));
$J = $year + floor($year/4) + $I + 2 - $C + floor($C/4);
$J = $J - 7*floor($J/7);
$L = $I - $J;
$M = 3 + floor(($L + 40)/44);
$D = $L + 28 - 31*floor($M/4);
if ($M<10) $M="0".$M;
if ($D<10) $D="0".$D;
return "$M-$D";
}
function arHelg($datum){
//
// (c) nicclas, [url]www.nic-sys.se[/url]
//
//
// arHelg($datum) - funktion som tar reda på om ett givet datum är en officiell helgdag.
// (utom "vanliga" söndagar).
// Indata - $datum enligt formatet "YYYY-MM-DD"
// Returnerar "" om ingen "helgdag", annars en sträng med namnet på helgdagen.
//
// Definition på helgdagarna från [url]http://www.jit.se/lagbok/989253t.html[/url]
$helgdagar=array("01-01" => "Nyårdagen",
"01-06" => "Trettondedagen",
"05-01" => "Första maj",
"12-25" => "Juldagen",
"12-26" => "Annandag jul");
$del=explode("-",$datum);
$year=$del[0];
$month=$del[1];
$day=$del[2];
$easter=getEaster($year);
$helgdagar[$easter]="Påskdagen";
$deleaster=explode("-",$easter);
$easter_stamp = mktime (0,0,0,$deleaster[0],$deleaster[1],$year);
$helgdagar[date("m-d",$easter_stamp-60*60*24*2)]="Långfredagen";
$helgdagar[date("m-d",$easter_stamp+60*60*24)]="Annandagpåsk";
$helgdagar[date("m-d",$easter_stamp+60*60*24*39)]="Kristi Himmelsfärdsdagen";
$helgdagar[date("m-d",$easter_stamp+60*60*24*49)]="Pingstdagen";
$helgdagar[date("m-d",$easter_stamp+60*60*24*50)]="Annandagpingst";
$mid_stamp = mktime (0,0,0,6,20,$year);
while(date("w",$mid_stamp)!=6){
$mid_stamp=$mid_stamp+60*60*24;
}
$helgdagar[date("m-d",$mid_stamp)]="Midsommardagen";
$helgon_stamp = mktime (0,0,0,10,31,$year);
while(date("w",$helgon_stamp)!=6){
$helgon_stamp=$helgon_stamp+60*60*24;
}
$helgdagar[date("m-d",$helgon_stamp)]="Alla helgons dag";
// echo "Testutskrift\n";
// foreach ($helgdagar as $key=>$datum) {
// echo "$key $datum\n";
// }
return $helgdagar["$month-$day"];
}
// Testkod:
echo "arHelg(2002-03-31): ";
echo arHelg("2002-03-31")."\n";
echo "arHelg(2002-04-01): ";
echo arHelg("2002-04-01")."\n";
?>
Tror att det fungerar åtminstone för år mellan 1970 och 2038! Säg till om du hittar något som inte blev korrekt.
/nicclas - https://www.frisim.com
Man tackar, ska pröva det :)
("Vanliga söndagar" dvs helger har jag redan fixat)