Hallo,
ich habe derzeit einen Kalender geschrieben, der jeweils für das aktuelle Halbjahr alle Tage inklusive Wochentagsabkürzung ausgibt.
Dazu dient eine Datenbank "Ferien" als hinterlegte Anfangs und Endangabe zum anzeigen der Ferien. Weiter habe ich einen Algorithmus für den Ostersonntag geschrieben und alle für das Bundesland hier notwendigen Feiertage in einem Array gespeichert.
Es gibt für die Ferien mehrere nutzbare Arrays:
$Monat_Anfang
$Monat_Ende
$Tag_Anfang
$Tag_Ende
Jeweils ist auf selber Position in welchem Monat die Ferien beginnen und wann sie enden (Analog der Tag).
Nun prüfe ich für jeden Wochentag, ob der Monat davon Feiertage oder Ferien enthält (effizienter wäre hier für jeden Monat zu prüfen..aber davon mal abgesehen.)
Die Ausgabe der Ferien gelingt schnell. Füge ich nun Tests für die Feiertage oder Wochenenden hinzu explodiert die Zeitnutzung..
Als weiteren Ansatz hatte ich versucht jedem Wochentag eine ID zuzuweisen, die aus dem Monat (ausgeschrieben) und dem Tagesdatum ohne führende 0 besteht. Also für den 1. Januar 2014 einfach: Januar1
Daraufhin wollte ich über verschachtelte For-Schleifen und If-Abfragen über CSS eine Hintergrundfarbe definieren. Hierbei bricht das Laden der Seite dann allerdings ab. Ich nutze CSS innerhalb von PHP. Ich stelle nun nachfolgend die zweite Methode zur Verfügung. Am Ende notiere ich dann nochmal, was mein Ziel mit diesem Kalender ist.
Die SQL-Einträge: Ferien.sql
Erzeugung des Kalenders:
Die Konfiguration des Kalenders: Kalender_Setup.php
Die CSS-Konfiguration: Ferien.php
Mein Ziel ist es, dass in dem Kalender freie Tage, wie Wochenenden, Ferien, Feiertage in einer HintergrundFarbe hervorgehoben werden. Weiter werden später Events aus einer Datenbank ausgelesen und auch diese sollen Farblich gekennzeichnet werden, mit einer anderen Farbe.
Weiter soll durch Mouse-Over (hover; kein java) der Name des Feiertages, die Bezeichnung der Ferien, die Beschreibung des Events auftauchen. Dies möchte ich dann mit einer Liste realisieren. Allerdings ist auch hier wieder das Problem, dass derzeit zu viele Operationen durchlaufen werden.
Mir würde eine Idee bereits helfen, wie ich das Vorhaben effizient umsetzen könnte. Da ich noch nicht viel Programmiererfahrung habe, kenne ich bestimmte Mechanismen nicht, die sich als Vorteilhaft herausgestellt haben, um die Rechenzeit zu verkürzen.
Weiter hatte ich gelesen, dass der Algorithmus für easter_date() (?) fehlerhaft sein soll und bei einigen Jahren einen anderen Wochentag ausgibt.
Viele Grüße und vielen Dank für die Hilfen und dafür, dass bis hier hin gelesen wurde,
Shalec
ich habe derzeit einen Kalender geschrieben, der jeweils für das aktuelle Halbjahr alle Tage inklusive Wochentagsabkürzung ausgibt.
Dazu dient eine Datenbank "Ferien" als hinterlegte Anfangs und Endangabe zum anzeigen der Ferien. Weiter habe ich einen Algorithmus für den Ostersonntag geschrieben und alle für das Bundesland hier notwendigen Feiertage in einem Array gespeichert.
Es gibt für die Ferien mehrere nutzbare Arrays:
$Monat_Anfang
$Monat_Ende
$Tag_Anfang
$Tag_Ende
Jeweils ist auf selber Position in welchem Monat die Ferien beginnen und wann sie enden (Analog der Tag).
Nun prüfe ich für jeden Wochentag, ob der Monat davon Feiertage oder Ferien enthält (effizienter wäre hier für jeden Monat zu prüfen..aber davon mal abgesehen.)
Die Ausgabe der Ferien gelingt schnell. Füge ich nun Tests für die Feiertage oder Wochenenden hinzu explodiert die Zeitnutzung..
Als weiteren Ansatz hatte ich versucht jedem Wochentag eine ID zuzuweisen, die aus dem Monat (ausgeschrieben) und dem Tagesdatum ohne führende 0 besteht. Also für den 1. Januar 2014 einfach: Januar1
Daraufhin wollte ich über verschachtelte For-Schleifen und If-Abfragen über CSS eine Hintergrundfarbe definieren. Hierbei bricht das Laden der Seite dann allerdings ab. Ich nutze CSS innerhalb von PHP. Ich stelle nun nachfolgend die zweite Methode zur Verfügung. Am Ende notiere ich dann nochmal, was mein Ziel mit diesem Kalender ist.
Die SQL-Einträge: Ferien.sql
Erzeugung des Kalenders:
PHP-Code:
<?php
include_once('./Kalender/Kalender_Setup.php');
include_once('./Kalender/Ferien.php');
<div id="Kalender">
<table id="Kalender-Tabelle">
<tr id="Kalender-Zeile">
<?php
if($Halbjahr == 1){$Erster_Monat = 8;}else{$Erster_Monat = 2;}
$Letzter_Monat = $Erster_Monat +5;
for($k=$Erster_Monat; $k <= $Letzter_Monat; $k++){
echo '<td style="width: 145px; margin-left: 5px"><p id="Kalender-MonatText">';
if($k==13){
$m=1;
}else{
$m=$k;
}
echo $Monat[$m];
echo '</p></td>';
}
?>
</tr>
<tr id="Kalender-Zeile">
<?php
for($monat=$Erster_Monat; $monat <= $Letzter_Monat; $monat++){
if($monat==13){$monate=1;$jahr=$jahr+1;}else{$monate=$monat;}
?>
<td>
<?php
$anz_tage = date("t", mktime(0,0,0,$monate,1,$jahr));
for($tage=1; $tage<= $anz_tage; $tage++ ){
$wochentag=date("D", mktime(0,0,0,$monate,$tage,$jahr));
?>
<div class="Wochentage-Div <?php include'./Kalender/Ferien.php';?>">
<?php
print $Wochen_Tage_kurz[$wochentag] . '<br>';
print $tage.'.';
?>
</div>
<div <?php echo 'id="' . $Monat[$monate] . $tage . '"'; ?> class="Wochentage-Beschreibung"
>
</div>
<?php
}
?>
</td>
<?php } ?>
</tr>
</table>
</div>
PHP-Code:
<?php
date_default_timezone_set('Europe/Berlin');
$akt_jahr = date('Y');
$jahr = $akt_jahr;
$akt_monat = date("n");
$HintergrundFarbe_Frei = "#FFC";
$HintergrundFarbe_Event = "#D2D2D2";
//if(isset($_GET['jahr'])) { $jahr = max($akt_jahr,intval($_GET['jahr'])); } else { $jahr = $akt_jahr; }
if( (!isset($_GET['monat'])) || ( (isset($_GET['monat'])) && ($_GET['monat']==0) ) ){
if($akt_monat < 8 && $akt_monat > 2){
$Halbjahr=2;
}else{
$Halbjahr=1;
}
}
/*
* Passe das Jahr entsprechend der Anzahl der Klicks an
*/
if(isset($_GET['Monat'])){
$Schritt = $_GET['Monat'];
}else{ $Schritt = 0; }
if( ($Schritt > 0) && ($Schritt % 2 ==1) ) { $jahr = $jahr + floor((1+$Schritt)/2); $Halbjahr=2;}
elseif( ($Schritt > 0) && ($Schritt % 2 == 0) ) { $jahr = $jahr + floor($Schritt/2); $Halbjahr =1;}
elseif( ($Schritt < 0) && (($Schritt) % 2 == 0)) { $jahr = $jahr + ceil($Schritt/2); $Halbjahr=1;}
elseif( ($Schritt < 0) && (abs($Schritt % 2) ==1)) { $jahr = $jahr + ceil($Schritt/2); $Halbjahr=2;}
/* Ferien */
$Sommerferien = array("Tag", "Monat", "Jahr", "Tag", "Monat", "Jahr");
$Winterferien = array("Tag", "Monat", "Jahr","Tag", "Monat", "Jahr");
$Weihnachtsferien = array ("Tag", "Monat", "Jahr", "Tag", "Monat", "Jahr");
$Oserferien = array ("Tag", "Monat", "Jahr", "Tag", "Monat", "Jahr");
$Pfingstferien = array ("Tag", "Monat", "Jahr", "Tag", "Monat", "Jahr");
$Herbstferien = array ("Tag", "Monat", "Jahr", "Tag", "Monat", "Jahr");
/* Feiertage */
// Berechnung des Ostersonntags
// Säkularzahl
$K = floor($jahr / 100);
// säkulare Mondschaltung
$M = 15 + floor((3 * $K + 3) / 4) - floor((8 * $K + 13) / 25);
// säkulare Sonnenschaltung
$S = 2 - floor((3 * $K + 3) / 4);
// Mondparameter
$A = $jahr % 19;
// Keim für den ersten Vollmond im Frühling
$D = (19 * $A + $M) % 30;
// kalendarische Korrekturgröße
$R = floor(($D + floor($A / 11)) / 29);
// Ostergrenze
$OG = 21 + $D - $R;
// Ersten Sonntag im März
$SZ = 7 - ($jahr + floor($jahr / 4 + $S)) % 7;
// Osterentfernung in Tagen
$OE = 7 - ($OG - $SZ) % 7;
// Ostersonntag als Märzdatum (32. März = 1. April usw.)
$OS=$OG + $OE;
/* Feiertage als Arrays
* ( Tag, Monat ), Jahr ist bekannt ($jahr).
*/
$Ostersonntag = array(
"Tag" => date("d", mktime(0,0,0,3,$OS,$jahr)),
"Monat" => date("n", mktime(0,0,0,3,$OS,$jahr))
);
$Karfreitag = array(
"Tag" => date("d", mktime(0,0,0,3,$OS-2,$jahr)),
"Monat" => date("n", mktime(0,0,0,3,$OS-2,$jahr))
);
$Ostermontag = array(
"Tag" => date("d", mktime(0,0,0,3,$OS+1,$jahr)),
"Monat" => date("n", mktime(0,0,0,3,$OS+1,$jahr))
);
$Himmelfahrt= array(
"Tag" => date("d", mktime(0,0,0,3,$OS+39,$jahr)),
"Monat" => date("n", mktime(0,0,0,3,$OS+39,$jahr))
);
$Pfingstsonntag = array(
"Tag" => date("d", mktime(0,0,0,3,$OS+49,$jahr)),
"Monat" => date("n", mktime(0,0,0,3,$OS+49,$jahr))
);
$Pfingstmontag = array(
"Tag" => date("d", mktime(0,0,0,3,$OS+50,$jahr)),
"Monat" => date("n", mktime(0,0,0,3,$OS+50,$jahr))
);
$Neujahr = array(
"Tag" => "1",
"Monat" => "1"
);
$Deutsche_Einheit = array(
"Tag" => "3",
"Monat" => "10"
);
$Weihnachtsfeiertag_1 = array(
"Tag" => "25",
"Monat" => "12"
);
$Weihnachtsfeiertag_2 = array(
"Tag" => "26",
"Monat" => "12"
);
$Tag_der_Arbeit = array(
"Tag" => "1",
"Monat" => "5"
);
$Feiertag_Monat = array (
$Ostersonntag["Monat"],
$Ostermontag["Monat"],
$Karfreitag["Monat"],
$Himmelfahrt["Monat"],
$Pfingstsonntag["Monat"],
$Pfingstsonntag["Monat"],
$Neujahr["Monat"],
$Deutsche_Einheit["Monat"],
$Weihnachtsfeiertag_1["Monat"],
$Weihnachtsfeiertag_2["Monat"],
$Tag_der_Arbeit["Monat"]
);
$Feiertag_Tag = array(
$Ostersonntag["Tag"],
$Ostermontag["Tag"],
$Karfreitag["Tag"],
$Himmelfahrt["Tag"],
$Pfingstsonntag["Tag"],
$Pfingstmontag["Tag"],
$Neujahr["Tag"],
$Deutsche_Einheit["Tag"],
$Weihnachtsfeiertag_1["Tag"],
$Weihnachtsfeiertag_2["Tag"],
$Tag_der_Arbeit["Tag"]
);
$Feiertag_Name = array(
"Ostersonntag",
"Ostermontag",
"Karfreitag",
"Himmelfahrt",
"Pfingstsonntag",
"Pfingstmontag",
"Neujahr",
"Tag der deutschen Einheit",
"Erster Weihnachtsfeiertag",
"Zweiter Weihnachtsfeiertag",
"Tag der Arbeit"
);
/*
* Ferien
*/
include_once("./verwaltung/db.php");
$sql = "SELECT Jahr as jahr, Sommer_Anfang as SA, Sommer_Ende as SE, Winter_Anfang as WA, Winter_Ende as WE, Herbst_Anfang as HA, Herbst_Ende as HE, Ostern_Anfang as OA, Ostern_Ende as OE, Weihnachten_Anfang as XA, Weihnachten_Ende as XE, Pfingsten_Anfang as PA, Pfingsten_Ende as PE FROM ferien ORDER BY jahr";
$ferien = mysqli_query($con, $sql);
$Ferien = array();
while ($row = mysqli_fetch_assoc($ferien)){$Ferien[] = $row;}
/*
* Erzeuge den Array mit allen Feriendaten aus der Datenbank für das ausgewählte Jahr
*/
$Ferienzeit=array();
foreach($Ferien as $Ferien){
if($Ferien['jahr']==$jahr){
foreach($Ferien as $Feriendato){
$Ferienzeit[]=$Feriendato;
}
}
}
/*
* Lösche das Feld "Jahr"
*/
array_splice($Ferienzeit, 0, 1);
/*
* Initialisiere die Arrays für die Monate und Tage
* -> Einfachere Weiterarbeit für den Kalender
*/
$Ferienzeit_Monat = array();
$Ferienzeit_Tag = array();
foreach($Ferienzeit as $Ferienzeit){
list($dummy, $monat, $tag) = explode("-", $Ferienzeit);
$Ferienzeit_Monat[]=date("n", mktime(0,0,0,$monat,$tag,$dummy));
$Ferienzeit_Tag[] = date("j", mktime(0,0,0,$monat,$tag,$dummy));
}
/*
* Schließe die Datenbankverbindung
*/
$con -> close();
/*
* Initialisiere die Ferienbezeichnungen
*/
$Ferienzeit_Name = array(//
0 => "Sommerferien",
1 => "Winterferien",
2 => "Herbstferien",
3 => "Osterferien",
4 => "Weihnachtsferien",
5 => "Pfingstferien"
);
/* Vorbereitung des Kalenders
* Monatsnamen und Wochentage auf Deutsch
*/
$Monat= array(
1 => "Januar",
2 => "Februar",
3 => "März",
4 => "April",
5 => "Mai",
6 => "Juni",
7 => "Juli",
8 => "August",
9 => "September",
10 => "Oktober",
11 => "November",
12 => "Dezember");
$Wochen_Tage= array(
"Sun" => "Sonntag",
"Mon" => "Montag",
"Tue" => "Dienstag",
"Wed" => "Mittwoch",
"Thu" => "Donnerstag",
"Fri" => "Freitag",
"Sat" => "Samstag");
$Wochen_Tage_kurz= array(
"Sun" => "So",
"Mon" => "Mo",
"Tue" => "Di",
"Wed" => "Mi",
"Thu" => "Do",
"Fri" => "Fr",
"Sat" => "Sa");
?>
PHP-Code:
<style type="text/css">
<?php
/* Vorhandene Variablen
* $jahr, $akt_jahr
* $Ferienzeit_Monat[] size=12
* $Ferienzeit_Tag[] size=12
* $Ferienzeit_Name[] size=6
*/
for($mon=0; $mon<=5; $mon++){
for($t=0; $t<=5; $t++){
$Monat_A = $Ferienzeit_Monat[2*$mon];
$Monat_B = $Ferienzeit_Monat[2*$mon+1];
$Tag_A = $Ferienzeit_Tag[2*$t];
$Tag_B = $Ferienzeit_Tag[2*$t+1];
if( ($Monat_B-1) ==0 ){$Diff=12;}else{$Diff=$Monat_B-1;}
if($Monat_A == $Monat_B){
for( $t=$Tag_A; $t <= $Tag_B; $t++ ){
echo '#' . $Monat[$Monat_A] . $t . '{ background-color: <?php echo $HintergrundFarbe_Frei;?>; }';
}
}
elseif($Monat_A == $Diff ){
$anz_tage_A = date("t", mktime(0,0,0,$Monat_A,1,$jahr));
for($t=$Tag_A; $t=$anz_tage_A; $t++){
echo '#' . $Monat[$Monat_A] . $t . '{ background-color: <?php echo $HintergrundFarbe_Frei;?>; }';
}
if($Monat_B==1){ $jahr=$jahr+1;}
for($t=1; $t=$Tag_B; $t++){
echo '#' . $Monat[$Monat_B] . $t . '{ background-color: <?php echo $HintergrundFarbe_Frei;?>; }';
}
}
elseif( ($Monat_A != $Diff) && ($Monat_A != $Monat_B) ){
$anz_tage_A = date("t", mktime(0,0,0,$Monat_A,1,$jahr));
$anz_tage = date("t", mktime(0,0,0,$Monat_A+1,1,$jahr));
$Monat_D=$Monat_A + 1;
for($t=$Tag_A; $t=$anz_tage_A; $t++){
echo '#' . $Monat[$Monat_A] . $t . '{ background-color: <?php echo $HintergrundFarbe_Frei;?>; }';
}
for($t=1; $t<= $anz_tage; $t++){
echo '#' . $Monat[$Monat_D] . $t . '{ background-color: <?php echo $HintergrundFarbe_Frei;?>; }';
}
for($t=1; $t<= $Tag_B; $t++){
echo '#' . $Monat[$Monat_B] . $t . '{ background-color: <?php echo $HintergrundFarbe_Frei;?>; }';
}
}
}
}
?>
</style>
Mein Ziel ist es, dass in dem Kalender freie Tage, wie Wochenenden, Ferien, Feiertage in einer HintergrundFarbe hervorgehoben werden. Weiter werden später Events aus einer Datenbank ausgelesen und auch diese sollen Farblich gekennzeichnet werden, mit einer anderen Farbe.
Weiter soll durch Mouse-Over (hover; kein java) der Name des Feiertages, die Bezeichnung der Ferien, die Beschreibung des Events auftauchen. Dies möchte ich dann mit einer Liste realisieren. Allerdings ist auch hier wieder das Problem, dass derzeit zu viele Operationen durchlaufen werden.
Mir würde eine Idee bereits helfen, wie ich das Vorhaben effizient umsetzen könnte. Da ich noch nicht viel Programmiererfahrung habe, kenne ich bestimmte Mechanismen nicht, die sich als Vorteilhaft herausgestellt haben, um die Rechenzeit zu verkürzen.
Weiter hatte ich gelesen, dass der Algorithmus für easter_date() (?) fehlerhaft sein soll und bei einigen Jahren einen anderen Wochentag ausgibt.
Viele Grüße und vielen Dank für die Hilfen und dafür, dass bis hier hin gelesen wurde,
Shalec
Kommentar