Bestimmte Tage ausgeben

Dragosius

Erfahrenes Mitglied
Hallo,

ich habe folgende Frage und weiß leider aktuell nicht wie ich das am Besten lösen kann.

  • Ich habe ein eingetragenes Datum in der Datenbank.
  • Es soll eine Anzeige bei folgenden Zeiträumen sein:
    • nach einem Monat
    • nach 3 Monaten
    • nach 6 Monaten
    • nach einem Jahr
    • Ab diesem Zeitpunkt immer jedes halbe Jahr
  • Wenn es das Datum nicht gibt (weil es z.B. auch den 30. Februar fällt) soll der folgende Tag gewählt werden

Hat da jemand eine Hilfestellung für mich?


Vielen Dank
 
Lösung
Super Danke

Also folgende Lösung funktioniert nun bei mir, ist aber länger geworden als erwartet. :)

PHP:
    // Abfrage des Jubiläum
    /*
    nach einem Monat
    nach 3 Monaten
    nach 6 Monaten
    nach einem Jahr
    Ab diesem Zeitpunkt immer jedes halbe Jahr
    */
    $jubilaeum = false;
    $datumHeute = new DateTime( heute() );
    $datumHeuteFormatiert = $datumHeute->format('Y-m-d');

    $registrierungsdatum1Monat = ( (new DateTime( $userdata['registration'] ))->add(new DateInterval('P1M')) )->format('Y-m-d');
    $registrierungsdatum3Monate = ( (new DateTime( $userdata['registration'] ))->add(new DateInterval('P3M')) )->format('Y-m-d');
    if( $registrierungsdatum1Monat ==  $datumHeuteFormatiert ) { // 1 Monat...
Das DateTime-Objekt hat eine Methode format(), damit kannst Du jeweils einen String aus Jahr, Monat und Tag erzeugen und diese dann vergleichen.

BTW: Wirft mal
einen Blick auf die Doku des Konstruktors
https://www.php.net/manual/de/datetime.construct.phperkennt man, dass ein Aufruf ohne Parameter ebenfalls die aktuelle Zeit liefert.

Entschuldige, ich habe hier noch eine Frage:

PHP:
($datumHeute->diff($registrierungsdatum))

Das gibt mir ja die Differenz der 2 Datums aus.
Wie kann es mit "->format" denn so formatieren, dass immer Monate und Jahre (wenn mehr als 1 Jahr) angezeigt werden.
z.B. "7 Monate und 2 Jahre" oder "11 Monate"

Danke :)
 
Das war jetzt ein Missverständnis, wie fast immer führen viele Wege nach Rom: Ich hatte mir vorgestellt, aus dem DateTime-Objekt für das Registrierungsdatum durch add das Datum des Jubiläums zu ermitteln und dann zu prüfen ob es gleich dem heutigen Datum ist. Dafür wollte ich den String aus Jahr, Monat und Tag verwenden.

Dein Weg kann jedoch genau so gut funktionieren: Die Differenz zwischen Registrierung und heute ermitteln und prüfen, ob sie gleich dem Abstand zwischen Registrierung und Jubiläum ist. Dann liefert wieder ein Blick in die Doku eine wichtige Info:
https://www.php.net/manual/de/class.dateinterval.phpUnter den Eigenschaften:
days
Wenn das DateInterval Objekt durch DateTime::diff() erstellt wurde, dann enthält diese Eigenschaft die Gesamtanzahl der Tage zwischen dem Start und Enddatum. Ansonsten enthält days den Wert FALSE.
Das heißt genau was Du brauchst.
 
Nein ich habe deinen Vorschlag schon verstanden und würde es auch so verwenden. :)

Ich möchte dem Mitglied nur gerne leserlich noch mitteilen, wie lange es nun registriert ist.
Daher stammt die 2. Frage. :)
 
Ach so, also noch ein Missverständnis :)
Offenbar hat das DateTimeInterval auch eine Methode format() mit der Du den String, den Du brauchst, erzeugen kannst:
https://www.php.net/manual/de/dateinterval.format.phpAllerdings stehen nur die numerischen Werte zur Verfügung, so dass Du Probleme bekommst, wenn Du "Monate" etc. in der lokalen Sprache erzeugen willst. Generell unterstützt das DateTime-Objekt keine Lokalisierung AFAIK.
 
Zuletzt bearbeitet:
Super Danke

Also folgende Lösung funktioniert nun bei mir, ist aber länger geworden als erwartet. :)

PHP:
    // Abfrage des Jubiläum
    /*
    nach einem Monat
    nach 3 Monaten
    nach 6 Monaten
    nach einem Jahr
    Ab diesem Zeitpunkt immer jedes halbe Jahr
    */
    $jubilaeum = false;
    $datumHeute = new DateTime( heute() );
    $datumHeuteFormatiert = $datumHeute->format('Y-m-d');

    $registrierungsdatum1Monat = ( (new DateTime( $userdata['registration'] ))->add(new DateInterval('P1M')) )->format('Y-m-d');
    $registrierungsdatum3Monate = ( (new DateTime( $userdata['registration'] ))->add(new DateInterval('P3M')) )->format('Y-m-d');
    if( $registrierungsdatum1Monat ==  $datumHeuteFormatiert ) { // 1 Monat
        $jubilaeum = true;
        $jublaeumZeitraum = '1 Monat';
    } else if( $registrierungsdatum3Monate ==  $datumHeuteFormatiert ) { // 3 Monate
        $jubilaeum = true;
        $jublaeumZeitraum = '3 Monaten';
    } else {
        $registrierungsdatumSchleife = new DateTime( $userdata['registration'] );
        $intervalYear = 0;
        $intervalMonth = 6;
        for ($i = 0; $i < 99; $i ++) { // Beginn mit 6 Monaten und dann halbjährlich
            $registrierungsdatumPlusZeitraumFormatiert = ( $registrierungsdatumSchleife->add(new DateInterval('P6M')) )->format('Y-m-d');
      
            // Schleife beenden, wenn das nächste Datum in der Zukunft liegt
            if ( $registrierungsdatumPlusZeitraumFormatiert > $datumHeuteFormatiert ) {
                break;
            }
      
            // Erstellen der lesbaren Monate und Jahre
            if($intervalYear == 0) {
                $jubilaeumJahre = '';
            } else if($intervalYear == 1) {
                $jubilaeumJahre = '1 Jahr';
            } else {
                $jubilaeumJahre = $intervalYear.' Jahren';
            }
            if($intervalMonth == 0) {
                $jubilaeumMonate = '';
            } else {
                $jubilaeumMonate = $intervalMonth.' Monaten';
            }
      
            // Lesbare Anzeige des Zeitraums
            if($jubilaeumJahre == '') {
                $jublaeumZeitraum = $jubilaeumMonate;
            } else if($jubilaeumMonate == ''){
                $jublaeumZeitraum = $jubilaeumJahre;
            } else {
                $jublaeumZeitraum = $jubilaeumJahre . ' und ' . $jubilaeumMonate;
            }
      
            // Hochzählen des Zeitraums für die nächste Runde
            if ($i % 2 != 0) { // Hier ist immer die Erhöhung um 6 Monate
                $intervalMonth = 6;
            } else { // Hier ist immer die Erhöhung der vollen Jahre
                $intervalYear = $intervalYear+1;
                $intervalMonth = 0;
            }
      
            // Prüfen, ob ein Jubiläum vorliegt
            if ( $registrierungsdatumPlusZeitraumFormatiert == $datumHeuteFormatiert ) {
                $jubilaeum = true;
                break;
            }
        }
    }

Ausgabe (gekürzt):
PHP:
if($jubilaeum) {
    echo "Du bist bereits seit $jublaeumZeitraum angemeldet.";
}
 
Zuletzt bearbeitet:
Lösung
Super, dass Du eine Lösung gefunden hast! Mit den verschiedenen Möglichkeiten für das Intervall ließ es sich wahrscheinlich nicht einfacher machen.
 
Zurück