Ersten Dienstag im Monat ermitteln?
fhabel
- php
0 Cheatah0 Felix Riesterer0 Teufelchen0 fhabel0 Cheatah0 Teufelchen
Hallo,
Ich will per PHP den ersten Dienstag eines Monats ermitteln.
Grund: Ich muss ein Datum ausgeben, dass mir das Datum eine Woche vor dem ersten Dienstag des nächsten Monats angibt.
Bin inzwischen schon ganz durcheinander von der Rumprobiererei und hab noch nix vernünftiges auf die Beine gestellt, vielleicht weiß hier jemand weiter?
Danke im Voraus
Hi,
Ich will per PHP den ersten Dienstag eines Monats ermitteln.
den Wochentag des Monatsersten zu ermitteln dürfte kein Problem sein. Daraus auf das Datum des ersten Dienstags zu schließen ebenfalls nicht: Wenn der 1. ein Dienstag ist, ist der erste Dienstag der 1. des Monats. Wenn der 1. ein Montag ist, ist der erste Dienstag der 2. des Monats. Wenn ...
Das geht mit einer simplen Liste. Es geht auch mit geringem Mehraufwand generisch, so dass Du durch Parameterübergabe nach dem Datum des ersten Donnerstags suchen kannst.
Bin inzwischen schon ganz durcheinander von der Rumprobiererei und hab noch nix vernünftiges auf die Beine gestellt,
Dann solltest Du Deine Versuche sowie die nicht von Dir lösbaren Probleme damit hier präsentieren.
Cheatah
Liebe(r) fhabel,
Bin inzwischen schon ganz durcheinander von der Rumprobiererei und hab noch nix vernünftiges auf die Beine gestellt
was hast Du denn bereits alles probiert? Zeig' doch mal etwas, an dem man Dir weiterhelfen kann!
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Ich will per PHP den ersten Dienstag eines Monats ermitteln.
getdate(), der Rest wurde hier schon beschrieben.
so, problem gelöst, hier mal mein Quellcode - vielleicht nützt er ja jemandem:
//=================================
$timestamp = time();
$aktdatum = date("d.m.Y",$timestamp);
$tag = substr($aktdatum,0,2);
$monat = substr($aktdatum,3,2);
$jahr = substr($aktdatum,6,4);
$dat = "$jahr-$monat-$tag";
function detailsDateFormat( $value )
{
$d = explode("-", $value);
$cdate = date ("l F j, Y", mktime (0,0,0,$d[1],$d[2],$d[0]));
// Wochentag des Monatsersten bestimmen:
$monatserster = date("l", mktime(0,0,0,$d[1]+1,01,$d[0]));
// Datum des ersten Dienstags des nächsten Monats bestimmen:
switch ($monatserster)
{
case "Monday": $ersterdienstag = date ("d.m.Y", mktime (0,0,0,$d[1]+1,02,$d[0]));break;
case "Tuesday": $ersterdienstag = date ("d.m.Y", mktime (0,0,0,$d[1]+1,01,$d[0]));break;
case "Wednesday": $ersterdienstag = date ("d.m.Y", mktime (0,0,0,$d[1]+1,07,$d[0]));break;
case "Thursday": $ersterdienstag = date ("d.m.Y", mktime (0,0,0,$d[1]+1,06,$d[0]));break;
case "Friday": $ersterdienstag = date ("d.m.Y", mktime (0,0,0,$d[1]+1,05,$d[0]));break;
case "Saturday": $ersterdienstag = date ("d.m.Y", mktime (0,0,0,$d[1]+1,04,$d[0]));break;
case "Sunday": $ersterdienstag = date ("d.m.Y", mktime (0,0,0,$d[1]+1,03,$d[0]));break;
}
//echo $ersterdienstag;
// Das Datum eine Woche zuvor berechnen:
$tag2 = substr($ersterdienstag,0,2);
$monat2 = substr($ersterdienstag,3,2);
$jahr2 = substr($ersterdienstag,6,4);
$ergebnis = date ("d.m.Y", mktime (0,0,0,$monat2,$tag2-7,$jahr2));
//Ausgabe:
echo $ergebnis;
}
detailsDateFormat("$dat");
//===============================
Das ganze ist natürlich weder optimal noch kurz und knapp programmiert, aber dafür für mich selbst einigermaßen verständlich aufgebaut ;)
Hi,
so, problem gelöst, hier mal mein Quellcode - vielleicht nützt er ja jemandem:
ja, nämlich Dir:
$timestamp = time();
$aktdatum = date("d.m.Y",$timestamp);
$tag = substr($aktdatum,0,2);
[...]
case "Monday": $ersterdienstag = date ("d.m.Y", mktime (0,0,0,$d[1]+1,02,$d[0]));break;
[...]
$tag2 = substr($ersterdienstag,0,2);
Es macht relativ wenig (nämlich überhaupt gar keinen) Sinn, einen Timestamp in einen String umzuwandeln, um diesen anschließend aufzuparsen und einen Timestamp daraus zu machen. Wenn Du die Problematik der Zeitumstellung beachtest (also nicht Mitternacht als Uhrzeit wählst), ist die Zahl der Sekunden pro Tag übrigens fix.
Cheatah
so, problem gelöst, hier mal mein Quellcode - vielleicht nützt er ja jemandem:
Nimm's nicht persönlich, aber auch wenn es tut, was es soll: Dieses Werk taugt bestenfalls als abschreckendes Beispiel.
$aktdatum = date("d.m.Y",$timestamp);
$tag = substr($aktdatum,0,2);
$monat = substr($aktdatum,3,2);
$jahr = substr($aktdatum,6,4);
$dat = "$jahr-$monat-$tag";
Das kannst du auch in einer Zeile haben:
$dat = date("Y-m-d", $timestamp);
function detailsDateFormat( $value )
{
$d = explode("-", $value);
$cdate = date ("l F j, Y", mktime (0,0,0,$d[1],$d[2],$d[0]));
$cdate benutzt du nirgendwo, Zeile ist überflüssig.
Weiterhin frage ich mich, warum du erst aus einem Zeitstempel eine Zeichenkette machst und dann in dieser Funktion die Zeichenkette wieder in einen Zeitstempel umwandelst. Den Umweg könntest du dir sparen.
// Wochentag des Monatsersten bestimmen:
$monatserster = date("l", mktime(0,0,0,$d[1]+1,01,$d[0]));// Datum des ersten Dienstags des nächsten Monats bestimmen:
switch ($monatserster)
{
case "Monday": $ersterdienstag = date ("d.m.Y", mktime (0,0,0,$d[1]+1,02,$d[0]));break;
case "Tuesday": $ersterdienstag = date ("d.m.Y", mktime (0,0,0,$d[1]+1,01,$d[0]));break;
case "Wednesday": $ersterdienstag = date ("d.m.Y", mktime (0,0,0,$d[1]+1,07,$d[0]));break;
case "Thursday": $ersterdienstag = date ("d.m.Y", mktime (0,0,0,$d[1]+1,06,$d[0]));break;
case "Friday": $ersterdienstag = date ("d.m.Y", mktime (0,0,0,$d[1]+1,05,$d[0]));break;
case "Saturday": $ersterdienstag = date ("d.m.Y", mktime (0,0,0,$d[1]+1,04,$d[0]));break;
case "Sunday": $ersterdienstag = date ("d.m.Y", mktime (0,0,0,$d[1]+1,03,$d[0]));break;
}
//echo $ersterdienstag;
Gottohweh.
Vielzeiliger Weg (mal mit date() statt getclock()):
switch (date("w", mktime(0, 0, 0, $d[1] + 1, 1, $d[0])))
case 0: $ersterdienstag = 3; // 0 = Sonntag -> Dienstag ist der 3.
break;
case 1: $ersterdienstag = 2; // 1 = Montag -> Dienstag ist der 2.
break;
case 2: $ersterdienstag = 1; // 2 = Dienstag -> Dienstag ist der 1.
break;
case 3: $ersterdienstag = 7; // usw.
break;
case 4: $ersterdienstag = 6;
break;
case 5: $ersterdienstag = 5;
break;
case 6: $ersterdienstag = 4;
break;
}
Wenigzeiliger Weg:
$ersterdienstag = 3 - date("w", mktime(0, 0, 0, $d[1] + 1, 1, $d[0]));
if ($ersterdienstag <= 0) {
$ersterdienstag += 7;
}
Den verwirrenden Unsinn, mit date() und mktime() erst wieder eine Zeichenkette zu basteln, lassen wir mal weg, denn in den nächsten Zeilen zerkloppst du dieselbige doch wieder in Einzelteile.
// Das Datum eine Woche zuvor berechnen:
$tag2 = substr($ersterdienstag,0,2);
$monat2 = substr($ersterdienstag,3,2);
$jahr2 = substr($ersterdienstag,6,4);$ergebnis = date ("d.m.Y", mktime (0,0,0,$monat2,$tag2-7,$jahr2));
Weniger umständlich, da ohne Umweg über eine Zeichenkette:
$vorwoche = mktime(0, 0, 0, $d[1] + 1, $ersterdienstag - 7, $d[0]);
return date("d.m.Y", $vorwoche);
Du scheinst eine Obszession für Zeichenketten zu haben. Dass du an solch aufwendigem Hin- und Hergebastel Freude hast, ist eine Sache, aber grundsätzlich ist es einfacher, mit einem Datumstyp zu arbeiten, in diesem Fall dem Unix-Zeitstempel.
Das ganze ist natürlich weder optimal noch kurz und knapp programmiert, aber dafür für mich selbst einigermaßen verständlich aufgebaut ;)
Nein, ganz im Gegenteil. Das ist ein heilloses Durcheinander von hinten durch die Brust ins Auge mit an bis zu siebenfacher Wiederholung der gleichen Anweisungen.