Datumsvergleich
Michael Wölk
- php
Hallo,
Ich bin immernoch dabei das Datumsvergleichs-Script zu schreiben:
gegeben ist ein datum innerhalb eines termins, es wird ausgerechnet wann der termin abgelaufen ist (im beispiel nach einem tag bzw. nach 24 stunden) - das ganze geht ganz gut mit
<?php
$stunden = '08';
$minuten = '32';
$tag = '05';
$monat = '05';
$jahr = '2003';
$plus = '1';
$tstamp = mktime(0, 0, 0, $monat, $tag+$plus, $jahr);
$atag = date("d", $tstamp);
$amonat = date("m", $tstamp);
$ajahr = date("Y", $tstamp);
?>
oben habe ich ein datum und eine zeit definiert.
dann gibt es die variable $plus mit der ich angeben kann wann der termin abgelaufen ist (in dem fall nach 24std).
und dann wird ausgerechnet und mir wird $atag, $amonat und $ajahr ausgegeben (stunden und minuten bleiben ja eh gleich)
wie kann ich jetzt vergleichen ob der termin nun abgelaufen ist - nach diesem beispiel hier sollte er abgelaufen sein.
mit einer einfachen if else abfrage kann das doch wegen den monatswechsel nicht funktionieren, da eine Größer kleiner abfrage dann ungültig wäre (ich hoffe ihr wisst was ich meine) - ich versuche es mal zu erklären:
Beispiel 1:
Termin Abgelaufen am Jetzt
01.05.03 02.05.03 06.05.03
02 < 06 = abgelaufen
Beispiel 2:
Termin Abgelaufen am Jetzt
29.04.03 30.04.03 06.05.03
30 < 06 = nicht abgelaufen
Wenn ich die Monate jetzt mit einbeziehe in eine if else abfrage dann könnte es klappen, jedoch ist das doch viel zu kompliziert für eine einfache abfrage ob ein termin abgelaufen ist. das geht doch bestimmt einfacher.
ich hab da irgendwie was im kopf:
wenn ich das Datum nehme das ich errechnet habe wann ein termin abgelaufen ist (im beispiel 1 ist das der 02.05.03) und das in sekunden umrechne, könnte ich doch eine differenz von dem jetzigen datum (in sekunden) errechnen. nur wie mache ich das?
ich hoffe ihr könnt ein wenig was dazu sagen.
nett wären auch ein paar zeilen code.
Danke
MfG
Michael Wölk
Hi,
also:
Du hast den Ablaufwert, den Du durch mktime schon in Sekunden umgewandelt hast. Dann brauchst Du nur noch das aktuelle Datum:
$now= time();
das hast Du so dann auch direkt in Sekunden seit 1970.
Dann subtrahierst Du den Ablaufwert mit now ($status = $tstamp - $now).
Ist das Ergebnis positiv, ist das Datum noch nicht erreicht, ist der wert negativ, ist der Termin vorbei.
Das sieht also so aus:
<?php
$stunden = '08';
$minuten = '32';
$tag = '05';
$monat = '05';
$jahr = '2003';
$plus = '1';
$tstamp = mktime(0, 0, 0, $monat, $tag+$plus, $jahr);
$now= time();
$status = $tstamp - $now;
if ($status < 0) echo "Der Termin ist vorbei!";
if ($status > 0) echo "Der Termin steht noch bevor!";
?>
Habs so probiert und kappt!
Wenn Du das Ergebnis dann noch durch 86400 teilst, hast Du die Zahl der Tage, die der Termin entweder schon vorbei ist oder die noch bis zu dem Termin sind. Je nachdem würde ich das dann noch runden.
Das sollte Dein Problem lösen:
Je nachdem was Du vorhast, geht es aber auch anders:
Wenn ich das richtig verstanden habe, willst Du eine Art Haltbarkeitswert angeben. Zum Beispiel wie lange ein Text zum Beispiel auf einer Newsseite angezeigt werden soll.
Ich würde das etwas anders angehen, vorausgesetzt dass ich das richtig verstanden habe und Du mit einer Datenbank arbeitest:
Wenn man z.B. die News speichert, wird direkt der Wert gesetzt, zu dem die News ablaufen. Also als Beispiel der
07.05.2003.
Bei Aufruf der Seite fragst Du dann einfach nur die Datensätze ab, die größer now sind. Alle anderen bleiben unbeachtet oder werden gelöscht.
Viel Erfolg,
Sebastian
Hallo,
Du könntest auch mit der Funktion strtotime() arbeiten.
Diese wandelt ein beliebiges Datum in eine fortlaufende Zahl. Du könntest beide so generierten Zahlen vergleichen und dann entscheiden, ob der Termin abgelaufen ist oder nicht.
Ausführlich wird die Funktion bechrieben unter:
http://www.php.net/manual/de/function.strtotime.php
und
http://www.selfphp4.de/funktionsreferenz/datums_und_zeit_funktionen/strtotime.php
Mit der Funktion wärst Du flexibler (insbes. bei Schaltjahren)
Schöne Grüße
Thorsten (Agentur 4e)
Hallo,
Mit der Funktion wärst Du flexibler (insbes. bei Schaltjahren)
erkennt mktime() denn die schaltjahre nicht?
Mit freundlichen Grüssen
Michael Wölk
Hi,
ich habe in Erinnerung, dass es bei der Funktion Probleme mit Schaltjahren und Sommerzeit/Winterzeit gab. Entweder vertue ich mich, oder das Problem wurde behoben.
Sorry für den Alarm.
Schöne Grüße
Thorsten
Das sollte Dein Problem lösen:
hat alles geklappt ;-)
Wenn ich das richtig verstanden habe, willst Du eine Art Haltbarkeitswert angeben. Zum Beispiel wie lange ein Text zum Beispiel auf einer Newsseite angezeigt werden soll.
ne son kinderkram!
Das ist so:
Das ganze ist ein Forum das zur Kommunikation zwischen Köln und Frankfurt steht (FirmenIntern).
Jeder Beitrag / Termin bekommmt eine Priorität, je nach dem wie wichtig es ist.
prio 1 aufträge müssen innerhalb von 24 stunden erledigt werden
prio 2 innerhalb drei tage usw.
wenn der termin jedoch von niemanden angenommen und die zeit überschrietten wurde, dann soll das datum blinken. Das dient alles dem Überblick.
Mit freundlichen Grüssen
Michael Wölk
und vielen dank für deine Hilfe
Hallo Michael,
[Lange komplizierte Ausfuehrungen gesnippt.]
wenn ich das Datum nehme das ich errechnet habe wann ein termin abgelaufen ist (im beispiel 1 ist das der 02.05.03) und das in sekunden umrechne, könnte ich doch eine differenz von dem jetzigen datum (in sekunden) errechnen. nur wie mache ich das?
Das ist der richtige Ansatz.
Wandle den Termin mit mktime() ins "Unix-Timestamp" Format um.
Den momentanen Zeitpunkt im Timestamp-Format kriegst Du mit time().
(Unix Timestamp: Anzahl Sekunden seit dem 01.01.1970, 00:00:00 Uhr.)
Diese Zahlen kannst Du dann ganz einfach vergleichen u.s.w.
Uebersicht der Datums- und Zeitfunktionen in PHP:
http://www.php.net/manual/de/ref.datetime.php
ich hoffe ihr könnt ein wenig was dazu sagen.
nett wären auch ein paar zeilen code.
Aus dem hohlen Bauch und ungetestet:
$jetzt=time();
$termin=mktime ($hh,$mm,$ss, $monat,$tag,$jahr);
$differenz=$termin-$jetzt;
$limite=24*60*60;
if (($differenz>$limite) AND ($differenz>0))
{
echo "Der Termin ist innerhalb der naechsten 24 Stunden.";
}
HTH, mfg
Thomas
Hallo Michael!
Grundsätzliche Frage: Du verwendest dies aber nicht im Zusammenhang mit einer Datenbank - oder? Dann wäre die Aufgabe nämlich anders und vor allem einfacher zu Lösen.
Andernfalls siehe Eintrag von Thomas ...
mfg
norbert =:-)
Hallo Michael!
Grundsätzliche Frage: Du verwendest dies aber nicht im Zusammenhang mit einer Datenbank - oder? Dann wäre die Aufgabe nämlich anders und vor allem einfacher zu Lösen.
Hi,
doch doch - das ganze läuft über MySQL, aber es funktioniert schon ganz gut so wie es mir Sebastian erklärt hat.
trotzdem würds mich interessieren was du noch dazu zu sagen hast...
Mit freundlichen Grüssen
Michael Wölk
Hallo Michael!
Select TO_DAYS(NOW() - Ablaufdatum) as Priority, Feld, Feld from Tabelle;
Gibt dir die Differenz zum Ablaufdatum in Tagen zurück (bzw. sollte).
Diese kannst Du im Script komfortabel und ohne weitere Rechnerei nutzen.
Hinweis: SQL vielleicht nicht ganz korrekt, da aus dem Handgelenk geschüttelt ;-)
Mehr dazu auf http://www.mysql.com
mfg
norbert =:-)