PHP Ermittlung des aktuellen Monats?

Dsimon24

Lieutenant
Registriert
Aug. 2016
Beiträge
595
Hallo zusammen,

ich versuche in PHP gerade den aktuellen, den letzten und den vorletzten Monat zu ermitteln.
Angegeben werden soll dass das jeweilige Datum:
aktueller Monat: 01.02.2020 bis 29.02.2020
letzter Monat: 01.01.2020 bis 31.01.2020
vorl. Monat: 01.12.2020 bis 31.01.2020

Jetzt fängt der Monat aber am 16. an und endet am 15. - wie realisiere ich das denn dann
am besten? Habt ihr Ideen, wie ich das realisieren kann?

Haben wir den bspw. 07.02. dann wäre der aktuelle Monat 16.01.2020 bis 15.02.2020
Haben wir den bspw. 21.02. dann wäre der aktuelle Monat 16.02.2020 bis 15.03.2020

Vielleicht habt ihr Ideen für mich?

VG, David
 
echo date('16.m.Y', strtotime('-2 Month'));//16.12.2019
echo date('15.m.Y', strtotime('-1 Month'));//15.01.2020
 
  • Gefällt mir
Reaktionen: Mihawk90
Nicht, wenn man zum Beispiel einen Abrechnungszeitraum braucht.
 
  • Gefällt mir
Reaktionen: areiland
PHP:
<?php

$now = new DateTimeImmutable();
$thisMonthStart = DateTimeImmutable::createFromFormat("Y-m-d H:i:s", $now->format("Y-m-01 00:00:00"));
$thisMonthEnd = $thisMonthStart->add(new DateInterval("P1M"))->sub(new DateInterval("PT1S"));

$fmt = "Y-m-d H:i:s";

var_dump([
  "now" => $now->format($fmt),
  "this month start" => $thisMonthStart->format($fmt),
  "this month end" => $thisMonthEnd->format($fmt),
]);

$offsetMonthStartInDays = 15;

$logicalMonthStart = $thisMonthStart->add(new DateInterval("P{$offsetMonthStartInDays}D"));
$logicalMonthEnd = $thisMonthEnd->add(new DateInterval("P{$offsetMonthStartInDays}D"));

var_dump([
  "real month start" => $logicalMonthStart->format($fmt),
  "real month end" => $logicalMonthEnd->format($fmt),
]);

Code:
array(3) {
  ["now"]=>
  string(19) "2020-02-28 12:57:13"
  ["this month start"]=>
  string(19) "2020-02-01 00:00:00"
  ["this month end"]=>
  string(19) "2020-02-29 23:59:59"
}
array(2) {
  ["real month start"]=>
  string(19) "2020-02-16 00:00:00"
  ["real month end"]=>
  string(19) "2020-03-15 23:59:59"
}
 
  • Gefällt mir
Reaktionen: axl foli
@Yuuri
Ich mache nicht viel mit DateTime und das kannte ich noch nicht, schöne Lösung!

Ich seh das hier wie Yuuri. Ich habe seine Post als Lösungsweg verstanden und finde diesen durchaus sinnvoll.
Es ist deutlich einfacher mit einem Objekt zu hantieren als sich das irgendwie mit strtotime zurecht zu häkeln.
Der TE hätte sich das in der selben Form auch googeln können. Eine fertige Lösung für das eigene Problem wird man selten/nie im Internet antreffen.
 
Blink 😳
Ich hab mich schon gewundert, wo zu einem eher simplen Thema so viele Antworten herkommen. Hätte ich mir ja auch denken können, daß stattdessen bekriegt wird. ... und natürlich ein Hinweis schuldig bleibt, warum denn der gepostete Ansatz von @Yuuri konzeptuell falsch sein soll.

Ich selber würde vermutlich für so ein Problem zunächst eine Klasse von Datetime ableiten.
Dann könnte(!) man weitere Properties hinzufügen, hier zB int $MonthStart = 16. Damit kann man dann zur Laufzeit feststellen, wo im Monat wir uns befinden und ob (base)day vor oder nach $Monthstart liegt.

Aber wenn ich ehrlich bin seh ich spontan auch kein “offensichtliches” Problem mit @Yuuri s Ansatz, natürlich unter der Maßgabe, daß das Ganze Teil eines zu instantiierenden Objekts wird und somit das $now dort zur Identität des jeweiligen Objekts wird.

Datetime ist kein Hexenwerk. Es ist nur nicht dezimal.
 
Dsimon24 schrieb:
Hallo zusammen,

ich versuche in PHP gerade den aktuellen, den letzten und den vorletzten Monat zu ermitteln.
Angegeben werden soll dass das jeweilige Datum:
aktueller Monat: 01.02.2020 bis 29.02.2020
letzter Monat: 01.01.2020 bis 31.01.2020
vorl. Monat: 01.12.2020 bis 31.01.2020

Jetzt fängt der Monat aber am 16. an und endet am 15. - wie realisiere ich das denn dann
am besten? Habt ihr Ideen, wie ich das realisieren kann?

Haben wir den bspw. 07.02. dann wäre der aktuelle Monat 16.01.2020 bis 15.02.2020
Haben wir den bspw. 21.02. dann wäre der aktuelle Monat 16.02.2020 bis 15.03.2020

Vielleicht habt ihr Ideen für mich?

VG, David

Methode von @Haggis aufbereitet:

Code:
function getMonths($anzahl) {
    $months = array();
    for($i=0; $i<$anzahl; $i++) {
        if(date('d') < 16) { //aktueller Monat ist 16. Vormonat bis 15. diesen Monats
          $months[] = array( date('16.m.Y',  strtotime((-1-$i).' Month')) , date('15.m.Y', strtotime((-$i).' Month')));
        } else { //aktueller Monat ist 16. diesen Monats bis 15. nächsten Monats
          $months[] = array( date('16.m.Y',  strtotime((-$i).' Month')) , date('15.m.Y', strtotime((1-$i).' Month')));
        }
    }
    return($months);
}

print_r(getMonths(3));

Gibt:
Array
(
    [0] => Array
        (
            [0] => 16.02.2020
            [1] => 15.03.2020
        )

    [1] => Array
        (
            [0] => 16.01.2020
            [1] => 15.02.2020
        )

    [2] => Array
        (
            [0] => 16.12.2019
            [1] => 15.01.2020
        )

)

Edith: Musst mal testen ob das für den 16. klappt, ich habs jetzt aus offensichtlichen Gründen nur für den 03.03. getestet ;)
 
Die Redundanz würde mich stören (ungetestet):
PHP:
function getMonths($anzahl) {
    $months = array();
    $monthOffset = (date('d') < 16) ? -1 : 0;
    for($i=0; $i<$anzahl; $i++) {
        $monthStart = -$monthOffset-$i;
        $months[] = array(date('16.m.Y', strtotime(($monthStart).' Month')),
            date('15.m.Y', strtotime(($monthStart+1).' Month')));
    }
    return($months);
}

@RalphS:
Und ich glaube, mehrere sehen das "offensichtliche" Problem nicht. Nämlich, dass die Logik heute sich nicht so verhält wie vom Fragesteller gewünscht. Aber das war ja auch so beabsichtigt.
 
  • Gefällt mir
Reaktionen: new Account()
tollertyp schrieb:
Die Redundanz würde mich stören (ungetestet):
PHP:
function getMonths($anzahl) {
    $months = array();
    $monthOffset = (date('d') < 16) ? -1 : 0;
    for($i=0; $i<$anzahl; $i++) {
        $monthStart = -$monthOffset-$i;
        $months[] = array(date('16.m.Y', strtotime(($monthStart).' Month')),
            date('15.m.Y', strtotime(($monthStart+1).' Month')));
    }
    return($months);
}

@RalphS:
Und ich glaube, mehrere sehen das "offensichtliche" Problem nicht. Nämlich, dass die Logik heute sich nicht so verhält wie vom Fragesteller gewünscht. Aber das war ja auch so beabsichtigt.

Unterschiedliche Geschmäcker, ich find meins etwas übersichtlicher, aber letztendlich isses Wurst.
Ergänzung ()

@RalphS man kanns auch simpel halten ;)
 
Zuletzt bearbeitet von einem Moderator:
Ist simple. Man löst ein Problem da, wo man es am wenigsten angucken muß.

Allerdings ist prozeduraler Stil ziemlich out, und man kann ihn auch nicht nach OO transformieren, weswegen ich persönlich der Effizienz wegen exakt einmal das Datetime Objekt erweitern würde. C# kann man einfach extensions hernehmen, wenn man das will. Und ich seh keinen Grund, für ein Datum alle existierenden Monate anzuschauen - einer reicht vollkommen, nämlich der benötigte.

Nb - einfache Rekursion und Schleifen unterscheiden sich faktisch nicht voneinander.
 
@RalphS:
"Und ich seh keinen Grund, für ein Datum alle existierenden Monate anzuschauen - einer reicht vollkommen, nämlich der benötigte. " - Verstehe ich nicht so ganz, was du mit alle existierende Monate anzuschauen" meinst.

Falls du dich auf die Schleife beziehst, das bezieht sich wohl auf den Ausgangspost:
aktueller Monat: 01.02.2020 bis 29.02.2020
letzter Monat: 01.01.2020 bis 31.01.2020
vorl. Monat: 01.12.2020 bis 31.01.2020

Und klar, kann man eine Klasse machen... aber mit C#-Argumenten zu kommen um in einer PHP-Anwendung für ein sauberes OOD zu argumentieren, halte ich für fragwürdig. Und ich wüsste nicht mal, ob ich für den Zweck in C# eine eigene Klasse machen würde - es ist ein typisches: Kommt drauf an. Vor allem, wie häufig die Logik benötigt wird und wer sie nutzt.

Aber vielleicht fehlt mir einfach die Vorstellungskraft, um den Mehrwert einer Klasse zu sehen. Vielleicht magst du sie uns ja zeigen, anstatt nur davon rumzureden. Weil über praktische/konkrete Dinge lässt sich meist besser diskutieren als über theoretische.
 
  • Gefällt mir
Reaktionen: new Account() und DubZ
Zurück
Oben