Bestimmte Tage ausgeben


Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

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
 

Sempervivum

Erfahrenes Mitglied
Es soll eine Anzeige ... sein
Das verstehe ich so, dass auf der Seite ein Text und/oder ein Bild angezeigt werden soll.

Wie soll das denn dann aussehen? Die Anzeige nach 3 Monaten für einen Tag oder dauerhaft bis die nächste Schwelle von 6 Monaten erreicht ist?
 

Dragosius

Erfahrenes Mitglied
Das sind sogenannte "Jubiläen".
Es soll als nur an diesen Tagen eine Info auf der Webseite angezeigt werden, dass man nun so und so lange registriert ist, z.B. "Du bist nun 6 Monate bei uns registriert.".
Zwischen diesen Tagen soll nichts angezeigt werden.
 

Sempervivum

Erfahrenes Mitglied
Immer gut, wenn man weiß, was sich dahinter im realen Leben verbirgt, dann versteht man es gleich besser.
Sieh dir das DateTime-Objekt an, da gibt es eine Methode add(), mit der Du zu einem gegebenen Datum (das aus der Datenbank) ein Zeitintervall hinzu addieren kannst. Dann bekommst Du die Daten der Jubiläen.
 

Dragosius

Erfahrenes Mitglied
Immer gut, wenn man weiß, was sich dahinter im realen Leben verbirgt, dann versteht man es gleich besser.
Sieh dir das DateTime-Objekt an, da gibt es eine Methode add(), mit der Du zu einem gegebenen Datum (das aus der Datenbank) ein Zeitintervall hinzu addieren kannst. Dann bekommst Du die Daten der Jubiläen.
Danke für die Hilfe, aber irgendwie bin ich noch zu blöd dafür.

Das Datum (als date gespeichert) bekomme ich ja so aus der Datenbank: $userdata['registration'];

Das heutige Datum verwende ich so:
PHP:
/**
* Gibt das heutige Datum, formatiert für die Datenbank, zurück
* @return string das heutige Datum im Format Y-m-d
*/
function heute() {
    $datum = date("Y-m-d");
    return $datum;
}

Ich bekomme es leider noch nicht hin, das nun in ein DateTime umzuwandeln.


Nachtrag:
Ich habe es nun so hin bekeommen:
$registrierungsdatum = new DateTime($userdata['registration']);
 

Dragosius

Erfahrenes Mitglied
Jetzt bin ich hier schon ein Stück weiter:
PHP:
$registrierungsdatum = new DateTime( $userdata['registration'] );
$registrierungsdatum->add(new DateInterval('P10D')); // 10 Tage

$datumHeute = new DateTime( heute() );
Wie kann ich hier in einer Abfrage herausfinden, wenn der Tag gleich ist?
Unterschiedliche Stunden sind mir hier egal.
 

Sempervivum

Erfahrenes Mitglied
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
erkennt man, dass ein Aufruf ohne Parameter ebenfalls die aktuelle Zeit liefert.
 
Zuletzt bearbeitet:

Dragosius

Erfahrenes Mitglied
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
erkennt 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 :)
 

Sempervivum

Erfahrenes Mitglied
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:
Unter 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.
 

Dragosius

Erfahrenes Mitglied
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. :)
 

Sempervivum

Erfahrenes Mitglied
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:
Allerdings 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:

Dragosius

Erfahrenes Mitglied
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:

Sempervivum

Erfahrenes Mitglied
Super, dass Du eine Lösung gefunden hast! Mit den verschiedenen Möglichkeiten für das Intervall ließ es sich wahrscheinlich nicht einfacher machen.
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

Neue Beiträge