Datumabfrage in If-Schleife
phpler
- php
Guten Morgen zusammen
ich möchte folgendes programmieren:
Ich habe ein Ablaufdatum Beispiel: 07.12.2012
Der Kunde kann das Produkt verlängern innerhalb von zwei Monaten
Somit wäre das Ablaufdatum Neu: 07.02.2013
if($ablauf->format('d.m.Y') < $heute->format('d.m.Y'))
{
echo "Bereits abgelaufen!<br>";
}
elseif($ablauf->format('d.m.Y') >= $heute->format('d.m.Y'))
{
echo "wird verlängert!";
}
Mit diesem Lauf funktioniert es => er kommt in die Bereits abgelaufen Schleife.
Wenn ich jedoch folgendes Ablaufdatum wähle: 07.12.2013
Somit ist ja das Produkt noch gültig er gelangt aber trotzdem in die Bereits abgelaufen Schleife.
Muss ich Datumsabfragen anders programmieren?
$ablauf->format('d.m.Y') ist bereits + zwei Monate
$heute->format('d.m.Y') ist das heute Datum
Danke für eure Hilfe!
Moin,
Wenn ich jedoch folgendes Ablaufdatum wähle: 07.12.2013
- zwei Monate: 07.02.2014
Genau das wäre zu definieren: Wieviele Tage stecken in zwei Monaten, die Du addierst.
Weil
$heute->format('d.m.Y') ist das heute Datum
Du Dich hier auf den Tag beziehst.
Guck Dir das mal genauer an, Du begehst hier einen systematischen Fehler.
Hotti
Darf ich dir mal kurz deine Frage mit anderen Worten stellen?
Hallo Leute, hab hier ein Problem bei einer meiner Methoden. Die wird wie folgt aufgerufen *aufruf*. Intern ist ein Fehler, die Methode möchte ich euch aber nicht zeigen.
Was meinst du wie die Hilfe aussieht?
Damit mein Posting dir aber eventuell doch noch etwas helfen könnte, rate ich dir immer mit Timestamps zu arbeiten. Bei einem Datum hast du ein String. Somit ist "31.01.2013" mehr als "07.07.2013", da php 7 < 31 vergleicht.
Gruß
Abgelaufener
T-Rex
Damit mein Posting dir aber eventuell doch noch etwas helfen könnte, rate ich dir immer mit Timestamps zu arbeiten.
Timestamps nach time_t (32 Bit) haben den signifikanten Nachteil des Überlaufs in absehbarer zeit - Zeitstempel nach ISO 8601 sind hier viel flexibler.
http://www.php.net/manual/de/datetime.diff.php
Hallo,
ich möchte folgendes programmieren:
dan tu das doch. ;-)
if($ablauf->format('d.m.Y') < $heute->format('d.m.Y'))
Ganz schlechter Ansatz. Mit format() wandelst du deine Datumswerte in Strings um, du vergleichst also letztendlich Strings. Ein Stringvergleich geht aber von links nach rechts zeichenweise durch, bis ein Unterschied festgestellt wird.
Solange die Wertigkeit der Stellen/Bestandteile von links nach rechts abnimmt, geht das noch (ist aber auch nicht schön); du setzt aber den Tag, also den niederwertigsten Anteil ganz nach links. Deine Abfrage wird also beispielsweise feststellen, dass der 04.01.2013 "kleiner", also früher ist als der 30.06.2008, einfach weil der Vergleich schon bei der ersten Stelle entschieden ist: '0' ist kleiner als '3'.
Hättest du bei der String-Umwandlung das ISO-Format verwendet (also erst das Jahr, dann den Monat, dann den Tag), dann würde es sogar mit der String-Variante funktionieren, wie du erwartest. Schön ist es dennoch nicht.
Darum: Rechen- oder Vergleichsoperationen nie mit Strings machen, wenn es besser geht.
Und es geht tatsächlich besser. Zum einen könntest du mit diff() die Differenz der beiden Datumswerte bilden und dann prüfen, ob das Feld invert des Ergebnisses gesetzt ist oder nicht. Das erscheint mir aber auch schon unnötig kompliziert.
Besser finde ich, beide Datumswerte in einen Timestamp zu wandeln - das ist einfach ein Zahlenwert, den man dann direkt vergleichen kann:
if ($ablauf->getTimestamp() < $heute->getTimestamp())
Mit diesem Lauf funktioniert es => er kommt in die Bereits abgelaufen Schleife.
Wer ist "er"?
Btw, der von dir gezeigte Code-Ausschnitt enthält keine Schleife. Und eine if-Schleife gibt es auch nicht.
Ciao,
Martin