Hallo. Versuche eine Excel-Formel auf PHP zu übersetzten, die folgendes (unter Excel erfolgreich) bewerkstelligt:
Sage mir, ob das Suchdatum, im Beispiel ein Sonnabend, der erste, zweite oder dritte Sonnabend im Monat ist.
Die Excel-Formel dazu ist eigentlich ganz leicht:
(wobei in der Zelle A1 ein Datum wie 12.05.2007 steht)
Heraus kommt eine Zahl 1-5, die das gewünschte Resultat bringt.
Mein Versuch in PHP bislang:
um an den Monatsletzen zu kommen:
1. Suche den 1. des Suchmonats (1.5.2007)
2. Suche den 1. der Vormonats (1.4.2007)
3. Berechne die Tage dazwischen (30)
4. zähle diese Tage auf den 1. des Vormonats drauf (1.4.2007 + 30 ) und ich habe den Monatsletzten, mit dem ich dann weiterarbeiten kann.
Mein 1. Problem nun ist, dass bei dem unten aufgeführten Code immer eine 30 herauskommt, auch wenn ich andere Monate als Startdatum setze.
Was ist an der Herangehensweise falsch?
Das 2. Problem besteht in der Weiterverarbeitung des Ergebnisses, um auf die Excel-Formel zu kommen.
Hätte ich also das Datum des Letzten im Vormonat (vor dem Suchmonat), dann würde ich im nächsten Schritt doch von dem Suchdatum das Monatsende des Vormonats abziehen.
Bei Excel kommt in diesem Fall beispielsweise 12 raus.
Bei mir hingegen, wenn ich meine beiden mit mktime formatierten Datumswerte ausgeben will, kommt eine Zahl heraus , die ja noch für die Ausgabe bzw. Weiterverarbeitung formatiert werden müsste. In dem Beispiel werhalte ich die Zahl 691200.
Mit date('d', $differenz) komme ich auch nicht auf die 12 wie bei Excel, sondern auf 01, wahrscheinlich weil der 1.1.1970 ausgegeben wird und meine mktime-Zahl nicht übersetzt wird.
Wie müsste daher der Befehl aussehen, um aus der Differenz zweier mktime-Zeiten eine Zahl in Tagen bzw. anderen Einheiten zu bekommen, mit denen man im Sinne der Excel-Formel weiterarbeiten könnte?
Wäre die Differenz zwischen Suchdatum und Monatletztem also klar, müsste der Rest der Formel ja wohl klappen mit:
($diff +6)/7 und dann noch mit ceil oder floor runden.
Hier mein Code:
Sage mir, ob das Suchdatum, im Beispiel ein Sonnabend, der erste, zweite oder dritte Sonnabend im Monat ist.
Die Excel-Formel dazu ist eigentlich ganz leicht:
Code:
=GANZZAHL((A1-MONATSENDE(A1;-1)+6)/7
Heraus kommt eine Zahl 1-5, die das gewünschte Resultat bringt.
Mein Versuch in PHP bislang:
um an den Monatsletzen zu kommen:
1. Suche den 1. des Suchmonats (1.5.2007)
2. Suche den 1. der Vormonats (1.4.2007)
3. Berechne die Tage dazwischen (30)
4. zähle diese Tage auf den 1. des Vormonats drauf (1.4.2007 + 30 ) und ich habe den Monatsletzten, mit dem ich dann weiterarbeiten kann.
Mein 1. Problem nun ist, dass bei dem unten aufgeführten Code immer eine 30 herauskommt, auch wenn ich andere Monate als Startdatum setze.
Was ist an der Herangehensweise falsch?
Das 2. Problem besteht in der Weiterverarbeitung des Ergebnisses, um auf die Excel-Formel zu kommen.
Hätte ich also das Datum des Letzten im Vormonat (vor dem Suchmonat), dann würde ich im nächsten Schritt doch von dem Suchdatum das Monatsende des Vormonats abziehen.
Bei Excel kommt in diesem Fall beispielsweise 12 raus.
Bei mir hingegen, wenn ich meine beiden mit mktime formatierten Datumswerte ausgeben will, kommt eine Zahl heraus , die ja noch für die Ausgabe bzw. Weiterverarbeitung formatiert werden müsste. In dem Beispiel werhalte ich die Zahl 691200.
Mit date('d', $differenz) komme ich auch nicht auf die 12 wie bei Excel, sondern auf 01, wahrscheinlich weil der 1.1.1970 ausgegeben wird und meine mktime-Zahl nicht übersetzt wird.
Wie müsste daher der Befehl aussehen, um aus der Differenz zweier mktime-Zeiten eine Zahl in Tagen bzw. anderen Einheiten zu bekommen, mit denen man im Sinne der Excel-Formel weiterarbeiten könnte?
Wäre die Differenz zwischen Suchdatum und Monatletztem also klar, müsste der Rest der Formel ja wohl klappen mit:
($diff +6)/7 und dann noch mit ceil oder floor runden.
Hier mein Code:
Code:
$suchdatum = '12.05.2007'; $suchdatum_erster = mktime(0,0,0,substr($suchdatum,3,2),1,substr($suchdatum,-4));//macht 1.5.2007 $suchdatum_vormonat_erster = mktime(0,0,0,substr($suchdatum,3,2)-1,1,substr($suchdatum,-4));//macht 1.4.2007 $suchdatum_ersterd = date('d.m.Y', $suchdatum_erster);//macht 1.5.2007 formatiert $suchdatum_vormonat_ersterd = date('d.m.Y', $suchdatum_vormonat_erster);//macht 1.4.2007 formatiert //Für die weitere Verarbeitung werden die Zeitangaben aus den beiden gefundenen Datumswerten extrahiert $x_jahr = substr($suchdatum_ersterd,-4) ; $x_monat = substr($suchdatum_ersterd,3,2) ; $x_tag = substr($suchdatum_ersterd,0,2) ; $y_jahr = substr($suchdatum_vormonat_ersterd,-4) ; $y_monat = substr($suchdatum_vormonat_ersterd,3,2) ; $y_tag = substr($suchdatum_vormonat_ersterd,0,2) ; //Jetzt die Differenz $diff = mktime ( 0, 0, 0, $x_monat, $x_tag, $x_jahr) - mktime ( 0, 0, 0, $y_monat, $y_tag, $y_jahr); echo abs($diff/(60*60*24)); //Kommt immer 30 raus //echo ceil(($diff +6)/7);
Kommentar