PHP deutsche Datum-/Zeitangabe und Vergleich

TuxuT

Ensign
Registriert
Sep. 2011
Beiträge
251
Guten Morgen,

ich habe derzeit bei PHP 7.2 folgendes Problem:
Ich habe einen Zeichenkette bzw. eine Zeitangabe in der Form "12.04.19 17:00" also [d.m.y H:i] vorliegen.
Jetzt müsste von dieser Zeitangabe eine Stunde abgezogen (-1 hours) werden...
Im Letzten Schritt müsste das Ergebnis ("12.04.19 16:00") geprüft werden, ob es in der Vergangenheit liegt, also < aktuelle DateTime ist...

Ich habe bereits viele viele Dinge probiert. Bekomme es aber irgendwie nicht hin...
Wer hat eine Lösung oder auch nur einen Ratschlag für mich?
PS: Oder muss ich erst die Angabe "12.04.19 17:00" nach "19/04/12 17:00" konvertieren damit das klappt?

Herzlichen Dank und guten Start in den Tag!
 
Hi,

poste doch mal den Code von dir, mit dem es nicht funktioniert.

VG,
Mad
 
Php timezone gesetzt?
 
Wir sind hier nicht da, um Aufgaben komplett zu lösen. Wie man aber mit Datum und Zeit an sich arbeitet, kann ich kurz mal anreißen:

PHP:
$d = DateTime::createFromFormat("d.m.y H:i", "12.04.19 17:00");
$d->add(DateInterval::createFromDateString("-1 hours"));
echo $d->format("Y-m-d H:i:s"), "\n";

Die wichtigste Erkenntnis sollte sein, dass man gar nicht mit Strings rumbastelt, sondern so schnell wie möglich in Datumsobjekte wechselt. Mehr Dokumentation dazu gibt es hier. Da ist dann auch zu finden, wie man ein Datumsobjekt mit der aktuellen Zeit erstellt, und wie man zwei solche Objekte vergleichen kann.
 
  • Gefällt mir
Reaktionen: TuxuT, BeBur, FranzvonAssisi und eine weitere Person
Eventuell will er eigentlich gar nicht 1 Stunde abziehen sondern die Zeitzone wechseln ... oder die Sommerzeit "berücksichtigen".
 
Nixdorf schrieb:
PHP:
$d = DateTime::createFromFormat("d.m.y H:i", "12.04.19 17:00");
$d->add(DateInterval::createFromDateString("-1 hours"));
echo $d->format("Y-m-d H:i:s"), "\n";

Kleiner Verbesserungsvorschlag:
PHP:
$d = DateTime::createFromFormat("d.m.y H:i", "12.04.19 17:00");
$d->modify("-1 hours");
echo $d->format("Y-m-d H:i:s"), "\n";

Ist einfacher zu lesen und tut das selbe. Ansonsten absolut korrekt.
 
  • Gefällt mir
Reaktionen: Nixdorf
Nixdorf schrieb:
Wir sind hier nicht da, um Aufgaben komplett zu lösen. Wie man aber mit Datum und Zeit an sich arbeitet, kann ich kurz mal anreißen:

PHP:
$d = DateTime::createFromFormat("d.m.y H:i", "12.04.19 17:00");
$d->add(DateInterval::createFromDateString("-1 hours"));
echo $d->format("Y-m-d H:i:s"), "\n";

Die wichtigste Erkenntnis sollte sein, dass man gar nicht mit Strings rumbastelt, sondern so schnell wie möglich in Datumsobjekte wechselt. Mehr Dokumentation dazu gibt es hier. Da ist dann auch zu finden, wie man ein Datumsobjekt mit der aktuellen Zeit erstellt, und wie man zwei solche Objekte vergleichen kann.

dateTime ist buggy as hell wenn man nicht in Utc sitzt. Das liefert schlicht falsche Ergebnisse:
https://bugs.php.net/bug.php?id=74274

Keine Ahnung wie es im aktuellsten Php aussieht aber ich schätze das ist noch immer kaputt. Ich hatte mal nen Link wie man Datümser voneinander abzieht, evtl kannst du da den Algorithmus anpassen, dauert aber zwei Wochen bis ich wieder am Rechner bin. Wenn Interesse besteht schick pn.

Edit: bzw bei dir ist es ganz simpel: mach einen Unixtimestamp draus und zieh 60*60Sekunden ab, dann prüf gegen time() ;)
 
Zuletzt bearbeitet von einem Moderator:
mambokurt schrieb:
dateTime ist buggy as hell wenn man nicht in Utc sitzt. Das liefert schlicht falsche Ergebnisse:
https://bugs.php.net/bug.php?id=74274

Ich habe mal die Bugs überflogen. Die Leute, die diese reported haben haben schlicht Angaben für die Timezone gemischt (Type 1 und 3) oder gar weggelassen. Das ist im Umgang mit Datumswerten so selten doof, dass ich finde die PHP Entwickler hätten das schlicht mit RTFM Kommentar schließen sollen. Wer sich auf Defaults und Systemverhalten verlässt ist meist eben genau das. Ich hatte entgegen deiner Aussage eben genau noch gar keine Probleme mit DateTime. Alles was man selbst implementiert, ist in jedem Fall schlechter, da kannst du mir erzählen was du willst.

Wichtig ist in jedem Fall mit korrekten Angaben für die Timezone zu arbeiten. Da gibt es eben die mit Daylight Saving Time (z.B. "Europe/Berlin") und die ohne ("CET" bzw. "CEST"). Wenn man Daten umrechnet bzw. umwandelt sollte man darauf achten, dass man diese Typen nicht mischt.
 
  • Gefällt mir
Reaktionen: Madman1209
Sgt_H4rtman schrieb:
Ich habe mal die Bugs überflogen. Die Leute, die diese reported haben haben schlicht Angaben für die Timezone gemischt (Type 1 und 3) oder gar weggelassen. Das ist im Umgang mit Datumswerten so selten doof, dass ich finde die PHP Entwickler hätten das schlicht mit RTFM Kommentar schließen sollen. Wer sich auf Defaults und Systemverhalten verlässt ist meist eben genau das. Ich hatte entgegen deiner Aussage eben genau noch gar keine Probleme mit DateTime. Alles was man selbst implementiert, ist in jedem Fall schlechter, da kannst du mir erzählen was du willst.

Wichtig ist in jedem Fall mit korrekten Angaben für die Timezone zu arbeiten. Da gibt es eben die mit Daylight Saving Time (z.B. "Europe/Berlin") und die ohne ("CET" bzw. "CEST"). Wenn man Daten umrechnet bzw. umwandelt sollte man darauf achten, dass man diese Typen nicht mischt.

https://bugs.php.net/bug.php?id=62331

Wenn du einen Zeitstempel mit Dst erstellst und befindest dich auf dem Server in dieser Dst biste ne Stunde daneben, verbessere mich wenn ich falsch liege aber das ist einfach kacke.

Ich seh jetzt auch nicht das Problem dass da überhaupt dateTime nötig macht:

"Ich habe einen Zeichenkette bzw. eine Zeitangabe in der Form "12.04.19 17:00" also [d.m.y H:i] vorliegen.
Jetzt müsste von dieser Zeitangabe eine Stunde abgezogen (-1 hours) werden...
Im Letzten Schritt müsste das Ergebnis ("12.04.19 16:00") geprüft werden, ob es in der Vergangenheit liegt, also < aktuelle DateTime ist..."

Einfach mit mktime (17,0,0,4,12,2019) nen Unixtimestamp draus gemacht,(oder strtotime genutzt), 60*60 von abgezogen und mit time() verglichen ob kleiner, fertig ist der Lack.
 
Aus meiner PHP-Zeit kenne ich noch Carbon. Weiß aber nicht, inwiefern das einen Benefit ggü. DateTime darstellt.
 
Zurück
Oben