2016-10-31 1 views
0

Dies ist das erste Mal, dass ich die eingebaute DateTime-Klasse verwendet habe, aber wir müssen Berechnungen basierend auf Monaten vorher/vorwärts machen und erhalten interessante Ergebnisse bei der Eingabe von Tageszahlen, die in einem Monat aber nicht in einem anderen existieren. und ich bin mir nicht sicher, ob PHP es wirklich genau macht! (BTW, ich habe das nur auf v5.2 Legacy-Code getestet, an dem ich jetzt arbeiten muss)PHP DateTime Monat richtig Rundung für fehlende Tagesnummern?

So, zum Beispiel, wenn ich das heutige Datum (2016-10-31) eingeben, subtrahieren Sie 6 Monate (mit -> modifizieren ('- 6 Monate'), das ausgegebene Datum (mit -> Format ('Ym-d')) ist der 1. Mai! (2016-05-01). Dies deutet darauf hin, dass PHP die Kette nur auf die Tage im nächsten Monat hochzieht (also 29 für Feb in einem Nicht-Schaltjahr ist der 1. März, 30 ist der 2. März, 31 ist der 3. März usw.).

Mit dieser Logik, ich deduzierte Mai 31 minus 1 Monat wäre 1. Mai, die es war, als ich es getestet!

Ist dies eine genaue Methode zum Hinzufügen/Subtrahieren nach Monat? Ich bin mir noch nicht sicher, ob unsere Abteilungen auf diese Weise rechnen, aber ich bin neugierig, ob noch jemand darauf gestoßen ist.

+1

Fast jeder, der mit Daten gearbeitet hat, ist in dieses hineingeraten, und es kommt von missverständlichen Daten .... Arbeit vom 1. des Monats, und dann auf den letzten Tag des Monats nach dem Hinzufügen/Subtrahieren –

+0

@mark -baker Missverständnisdaten? Ich habe nur beschrieben, wie PHP es berechnet ... Ich habe keine Kontrolle darüber, es sei denn, ich möchte ihren Quellcode ändern und neu kompilieren ... er kam von Zend. Ich kann nicht unbedingt ab dem 1. des Monats arbeiten, wenn der Benutzer den ursprünglichen Monat/Tag auswählt und ich von dort Monat (e) subtrahieren muss. Ich habe nur gefragt, ob die PHP-Logik der richtige Weg ist, um nach Monat zu subtrahieren (Javascript und Microsoft machen es anders). –

Antwort

0

Dies ist ein wenig breit, aber ...

Das Problem mit, wie Sie denken, dass

2016-10-31 - 6 Monate = 2016.04.30

PHP denkt als solche

$date = new DateTime('2016-10-31'); 
$date->modify('-6 months'); // PHP subtracts 183 days in all the tests I ran 
echo $date->format('Y-m-d'); // 2016-05-01 

Sie gehen mit Ihrem eigenen methodolog kommen bis zu haben y, weil modify ist im Grunde ein Guesstimate für Dinge wie Monate, die 28-31 Tage lang sein können. Mit anderen Worten, PHP macht viele Dinge, die "gut genug" sind, wenn Sie keine hohe Präzision benötigen.

+0

Ich denke nicht so oder so, ich frage, ob PHP's Weg (aufrunden) richtig ist, weil Javascript und Microsoft es anders machen (Abrunden). 'modify' ist kein Guesstimate, es verschiebt buchstäblich jeden fehlenden Tag in den nächsten Monat; es funktioniert jedes Mal auf dieselbe exakt vorhersehbare Art und Weise. Die Frage ist, ob dies richtig ist oder nicht, da andere Nicht-Entwickler-Benutzer Excel und Kalender verwenden, die stattdessen abgerundet werden. –

+0

Sie müssen dann einen Fehlerbericht für diese Datei einreichen. Nur ein Grußwort, tho. Es gibt eine [Warnung auf der Änderungsseite] (http://www.php.net/manual/en/datetime.modify.php) 'Beispiel # 2 Vorsicht beim Hinzufügen oder Subtrahieren von Monaten' – Machavity

+0

Ein Fehlerbericht? Ich weiß nicht, ob PHP es falsch macht ... Ich frage, ob es richtig ist (nicht wenn PHP es so macht, wie es die Programmierer beabsichtigt haben). Ich überprüfte die Frage, die Sie markiert, ein Duplikat von, und die Antwort sagt, dass PHP es die richtige Art und Weise tut, also bin ich nicht sicher, warum Sie vorschlagen, dies als Fehler zu melden, da ich nicht sicher bin, warum Microsoft und Javascript macht es anders (wer ist richtig ???). Kann das wirklich nur eine Frage des Geschmacks sein? Das bedeutet, dass unsere Entwickler mit unseren Excel-Benutzern in Konflikt geraten, wenn wir nicht die Art von PHP vermeiden. –