Contao-Camp 2024
Ergebnis 1 bis 18 von 18

Thema: Datum und Uhrzeit vernünftig ausgeben

  1. #1
    Contao-Fan
    Registriert seit
    20.10.2014.
    Ort
    Freiburg
    Beiträge
    477

    Standard Datum und Uhrzeit vernünftig ausgeben

    Hallo zusammen,

    meine bisherige Lösung der Datums,- Uhrzeitausgabe ist nicht sehr zufriedenstellend.

    Hätte gerne folgende Ausgabe:

    1. Startdatum Startzeit - Enddatum Endzeit
    2. Startdatum Startzeit (Wenn Enddatum Endzeit nicht angegeben)
    3. Startdatum Startzeit - Endzeit (Wenn Enddatum nicht angegeben)


    Vllt kann mir hier jemand weiterhelfen! Danke!

    Bisherige Lösung:

    1. Startdatum - Enddatum Startzeit - Endzeit


    PHP-Code:
    <p class="date_info">

        <?php if ($this->startDate): ?>
        <?php echo date("d.m.Y"$this->startDate); ?>
        <?php endif; ?>
        
         <?php if ($this->endDate): ?>
        - <?php echo date("d.m.Y"$this->endDate); ?>
        <?php endif; ?>
        
        <?php if ($this->startTime): ?>
        ab <?php echo date("H:i"$this->startTime); ?> Uhr
        <?php endif; ?>
        
        <?php if ($this->endTime): ?>
        bis <?php echo date("H:i"$this->endTime); ?> Uhr
        <?php endif; ?>
     
      </p>

  2. #2
    Contao-Urgestein Avatar von Andreas
    Registriert seit
    19.06.2009.
    Ort
    Mönchengladbach
    Beiträge
    7.703
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Vielleicht machst du deine Logik besser in einen einzigen PHP-Block, das wäre übersichtlicher für dich.

    Benutze \Date::parse() anstatt date(). date() ist nur in Englisch.
    Bitte!
    Vor Anfragen im Forum HTML validieren.
    Codesnippets hier im Froum sauber einrücken. Nur Tabs o. nur Leerzeichen verwenden.

    Vielen Dank an alle Wunschlistenerfüller
    Andreas Burg, Web Solutions

  3. #3
    Contao-Fan
    Registriert seit
    20.10.2014.
    Ort
    Freiburg
    Beiträge
    477

    Standard

    Zitat Zitat von Andreas Beitrag anzeigen
    Vielleicht machst du deine Logik besser in einen einzigen PHP-Block, das wäre übersichtlicher für dich.

    Benutze \Date:arse() anstatt date(). date() ist nur in Englisch.
    Das muss ich auch noch anpassen. Danke.

    Die Frage war aber eher: Wie kann ich abfragen ob Enddatum und Endzeit gesetzt ist um dann die entsprechende Variante 1-3 auszugeben?

  4. #4
    Contao-Urgestein Avatar von Andreas
    Registriert seit
    19.06.2009.
    Ort
    Mönchengladbach
    Beiträge
    7.703
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat Zitat von marcohe Beitrag anzeigen
    Die Frage war aber eher: Wie kann ich abfragen ob Enddatum und Endzeit gesetzt ist um dann die entsprechende Variante 1-3 auszugeben?
    Ich weiß, ich habe aber gerade keine Zeit um mir die Logik da auszuarbeiten. Mit
    PHP-Code:
    $this->showTemplateVars(); 
    hast du die Variablen ja zur Verfügung und kannst das selber rausklamüsern. $this->variable ist immer false, wenn sie gleich 0, leer oder NULL ist.
    Bitte!
    Vor Anfragen im Forum HTML validieren.
    Codesnippets hier im Froum sauber einrücken. Nur Tabs o. nur Leerzeichen verwenden.

    Vielen Dank an alle Wunschlistenerfüller
    Andreas Burg, Web Solutions

  5. #5
    Contao-Nutzer
    Registriert seit
    06.09.2016.
    Beiträge
    125

    Standard

    Du musst zusätzlich mit der Variable addTime arbeiten, die 1 wird, wenn ein Zeitstempel vorhanden ist. Wie von Andreas vorgeschlagen hier ein möglicher PHP-Block für den Anfang, mit <?php echo $datumneu; ?> müsstest du dann im Template die neue Variable ausgeben...

    PHP-Code:
    <?php
        $datumneu 
    "";
        if (
    $this->endDate==""): {
            
    $datumneu.=$this->parseDate("l, j.n.Y"$this->startDate);
            if (
    $this->addTime!=""): {
                
    $datumneu.=", ".$this->parseDate("H:i"$this->startTime);
                if (
    $this->parseDate("H:i"$this->endTime)!=$this->parseDate("H:i"$this->startTime)): $datumneu.=" - ".$this->parseDate("H:i"$this->endTime)." Uhr"; else: $datumneu.=" Uhr"; endif;
            } endif;
        } else: {
            
    $datumneu.=$this->parseDate("l, j.n.Y"$this->startDate);
            if (
    $this->addTime!=""): {
                
    $datumneu.=", ".$this->parseDate("H:i"$this->startTime)." Uhr - ";
                
    $datumneu.=$this->parseDate("l, j.n.Y"$this->endDate);
                if (
    $this->parseDate("H:i"$this->endTime)!=$this->parseDate("H:i"$this->startTime)): $datumneu.=", ".$this->parseDate("H:i"$this->endTime)." Uhr"; endif;
            } else: {
                
    $datumneu.=" - ".$this->parseDate("l, j.n.Y"$this->endDate);
            } endif;
        } endif; 
    ?>
    Geändert von Physiklehrer (03.06.2017 um 10:58 Uhr)

  6. #6
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.939

    Standard

    Zitat Zitat von marcohe Beitrag anzeigen
    1. Startdatum Startzeit - Enddatum Endzeit
    2. Startdatum Startzeit (Wenn Enddatum Endzeit nicht angegeben)
    3. Startdatum Startzeit - Endzeit (Wenn Enddatum nicht angegeben)
    Im Prinzip so , wie Du es bereits geschrieben hast:

    PHP-Code:
        <?php if ($this->startDate && $this->endDate): ?>
            <?= date("d.m.Y"$this->startDate); ?>
            <?php if ($this->startTime): ?>
                <?= date("d.m.Y"$this->startTime); ?>
            <?php endif; ?>
            - 
            <?= date("d.m.Y"$this->endDate); ?>
            <?php if ($this->endTime): ?>
                <?= date("d.m.Y"$this->endTime); ?>
            <?php endif; ?>
       <?php endif; ?>

        <?php if ($this->startDate && !$this->endDate): ?>
            <?= date("d.m.Y"$this->startDate);  ?>
            <?php if ($this->startTime): ?>
                <?= date("d.m.Y"$this->startTime);  ?>
            <?php endif; ?>
            <?php if ($this->endTime): ?>
                 - 
                <?= date("d.m.Y"$this->endTime); ?>
            <?php endif; ?>
       <?php endif; ?>

      // usw. ggf. weitere Fallunterscheidungen
      </p>
    Und natürlich noch die Anpassung \Date:arse() aus #2 einarbeiten ;-)
    Geändert von fiedsch (01.06.2017 um 18:21 Uhr)
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  7. #7
    Alter Contao-Hase Avatar von kmielke
    Registriert seit
    21.06.2009.
    Beiträge
    1.173

    Standard

    Habe das Thema mal verschoben, da es ja nichts mit calendar_extended zu tun hat.

    Gruß Kester
    Gruß Kester

    Kein Support via PN ohne vorherige Absprache.

  8. #8
    Contao-Fan
    Registriert seit
    20.10.2014.
    Ort
    Freiburg
    Beiträge
    477

    Daumen hoch

    Zitat Zitat von Physiklehrer Beitrag anzeigen
    Du musst zusätzlich mit der Variable addTime arbeiten, die 1 wird, wenn ein Zeitstempel vorhanden ist. Wie von Andreas vorgeschlagen hier ein möglicher PHP-Block für den Anfang, mit <?php echo $datumneu; ?> müsstest du dann im Template die neue Variable ausgeben...
    Habe das gerade mal durchgespielt. Funktioniert wunderbar.
    Der einzige Manko an deinem Beispiel ist, dass wenn nur Startdatum und Startzeit angegeben ein Bindestrich vor dem "Uhr" steht (Freitag, 2.6.2017, 22:00 - Uhr)) aber damit könnte ich erstmal leben :-)
    Geändert von marcohe (01.06.2017 um 22:33 Uhr)

  9. #9
    Contao-Nutzer
    Registriert seit
    06.09.2016.
    Beiträge
    125

    Standard

    Der einzige Manko an deinem Beispiel ist, dass wenn nur Startdatum und Startzeit angegeben ein Bindestrich vor dem "Uhr" steht (Freitag, 2.6.2017, 22:00 - Uhr))
    Eigentlich wird auch dieser Fall behandelt, und zwar in Zeile 7. Da prüfe ich, ob Startzeit und Endzeit gleich sind, was in Contao ja eigentlich das Signal für Events mit offenem Ende sind (siehe Erklärtext im Backend). Falls du eine andere Identifikation für offene Events verwendest, müsstest du diese Zeile anpassen. Evtl. tut es ein ">" statt des "!=" in der IF-Abfrage, also so:
    Code:
    if ($this->parseDate("H:i", $this->endTime)>$this->parseDate("H:i", $this->startTime))
    Edit: Denkfehler in der ersten Version, es muss > sein
    Geändert von Physiklehrer (02.06.2017 um 07:56 Uhr)

  10. #10
    Contao-Urgestein Avatar von Andreas
    Registriert seit
    19.06.2009.
    Ort
    Mönchengladbach
    Beiträge
    7.703
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat Zitat von Physiklehrer Beitrag anzeigen
    hier ein möglicher PHP-Block
    PHP-Code im Forum bitte in den PHP-Wrapper setzen.
    Bitte!
    Vor Anfragen im Forum HTML validieren.
    Codesnippets hier im Froum sauber einrücken. Nur Tabs o. nur Leerzeichen verwenden.

    Vielen Dank an alle Wunschlistenerfüller
    Andreas Burg, Web Solutions

  11. #11
    Contao-Fan
    Registriert seit
    20.10.2014.
    Ort
    Freiburg
    Beiträge
    477

    Standard

    Zitat Zitat von Physiklehrer Beitrag anzeigen
    Edit: Denkfehler in der ersten Version, es muss > sein
    Genau. In Zeile 7 und 15. Alle Möglichkeiten getestet und läuft perfekt. Nur noch meine CSS-Klassen dazwischen frimeln

  12. #12
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.939

    Standard

    PHP-Code:
    if ($this->parseDate("H:i"$this->endTime)>$this->parseDate("H:i"$this->startTime)) 
    scheint mir aber aber nicht ganz korrekt. Der Vergleich bezieht sich auf zwei Zeichenketten, die durch die Formatierung des Datums (der Uhrzeit) entstehen.
    Hier ist dann (z.B.) "23:00" größer als "20:00". Soweit OK. Aber wenn ein Termin bis (z.B.) "02:00" geht ist "02:00" nicht größer als "20:00". Ich habe es jetzt auch die
    Schnelle nicht aus eurem PHP-Code rauslesen können, ob das Datum zusätzlich berücksichtigt wird, aber das muss es!
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  13. #13
    Contao-Fan
    Registriert seit
    20.10.2014.
    Ort
    Freiburg
    Beiträge
    477

    Standard

    Zitat Zitat von fiedsch Beitrag anzeigen
    Ich habe es jetzt auch die
    Schnelle nicht aus eurem PHP-Code rauslesen können, ob das Datum zusätzlich berücksichtigt wird, aber das muss es!
    Stimmt der Fall wird nicht berücksichtigt. An die Möglichkeit habe ich gar nicht gedacht... Wenn die Endzeit kleiner ist wie in deinem Beispiel wird sie nicht ausgegeben.

  14. #14
    Contao-Nutzer
    Registriert seit
    06.09.2016.
    Beiträge
    125

    Standard

    Vielen Dank für Eure Rückmeldungen! Beide Probleme (Berücksichtigung des Datums und das Zeichenketten-Problem) lassen sich lösen, indem in der IF-Abfrage nicht auf die die umgewandelte Variable, sondern den originalen Unix-Timestamp geprüft wird. Das ist natürlich auch deutlich kürzer. Also so:

    PHP-Code:
    <?php
        $datumneu 
    "";
        if (
    $this->endDate==""): {
            
    $datumneu.=$this->parseDate("l, j.n.Y"$this->startDate);
            if (
    $this->addTime!=""): {
                
    $datumneu.=", ".$this->parseDate("H:i"$this->startTime);
                if (
    $this->endTime $this->startTime): $datumneu.=" - ".$this->parseDate("H:i"$this->endTime)." Uhr"; else: $datumneu.=" Uhr"; endif;
            } endif;
        } else: {
            
    $datumneu.=$this->parseDate("l, j.n.Y"$this->startDate);
            if (
    $this->addTime!=""): {
                
    $datumneu.=", ".$this->parseDate("H:i"$this->startTime)." Uhr - ";
                
    $datumneu.=$this->parseDate("l, j.n.Y"$this->endDate);
                if (
    $this->endTime $this->startTime): $datumneu.=", ".$this->parseDate("H:i"$this->endTime)." Uhr"; endif;
            } else: {
                
    $datumneu.=" - ".$this->parseDate("l, j.n.Y"$this->endDate);
            } endif;
        } endif; 
    ?>
    Allerdings ist es jetzt nicht mehr möglich, mehrtägige Events mit offenem Ende anzuzeigen, die nur eine Startzeit, aber keine Endzeit haben. Also so etwas: "Samstag, 3.6.2017, 15:00 Uhr - Montag, 5.6.2017". Jetzt wird dann zwingend immer auch eine Endzeit ausgegeben, also z.B. "Samstag, 3.6.2017, 15:00 Uhr - Montag, 5.6.2017, 13:00 Uhr", im Zweifel eben 00.00 Uhr oder die gleiche Zeit wie beim Start.

    Mein ursprünglicher Post war deshalb über den Vergleich der Zeichenketten programmiert, da ich gemäß Contao-Standard bei gleichem Wert von Start- und Endzeit diese Ausgabe als offenes Ende, also "Samstag, 3.6.2017, 15:00 Uhr - Montag, 5.6.2017" haben wollte. Nachteil: es geht dann kein mehrtägiger Termin mit tatsächlich gleicher Start- und Endzeit mehr, also z.B. "Samstag, 3.6.2017, 15:00 Uhr - Montag, 5.6.2017, 15:00 Uhr".

    Wenn du dir beide Optionen offen halten willst, müsstest du dir eine andere Markierung für das offene Ende überlegen, z.B. die Uhrzeit 23:23 Uhr, und dann auf diese prüfen (dann wieder z.B. mit Umwandlung in String). Klar, dass dann kein Termin tatsächlich um 23:23 Uhr enden darf, sonst würde dieser ohne Uhrzeit als "offenes Ende" angezeigt.

  15. #15
    Contao-Fan
    Registriert seit
    20.10.2014.
    Ort
    Freiburg
    Beiträge
    477

    Standard

    Hab mich dafür entschieden Datum und Uhrzeit zu trennen, was das Ganze wesentlich vereinfacht und dazu finde ich es noch übersichtlicher.

    Das Ergebnis sieht für mein event_upcoming.html5 so aus:

    PHP-Code:
    <div class="date_time">
                <meta itemprop="startDate" content=" <?php echo date("Y-m-d"$this->begin);  ?>">
                
                <i class="fa fa-calendar" aria-hidden="true"></i> 
                <span class="date"> 
                <?php if ($this->startDate && $this->endDate): ?> 
                <?php echo $this->parseDate("d.m."$this->startDate); ?> -
                <?php echo $this->parseDate("d.m.y"$this->endDate); ?>
                <?php endif; ?> 
                   
                   <?php if ($this->startDate && !$this->endDate): ?> 
                <?= date("d.m.y"$this->begin);  ?>
                   <?php endif; ?>
                   </span>
                
                <span class="time"> 
                
                <?php if ($this->addTime): ?>
                <i class="fa fa-clock-o" aria-hidden="true"></i>
                <?php if ($this->startTime && $this->endTime): ?> 
                <?php echo $this->parseDate("H:i"$this->startTime); ?> -  
                <?php echo $this->parseDate("H:i"$this->endTime); ?> Uhr
                 <?php endif; ?> 
       
       
                  <?php if ($this->startTime && !$this->endTime): ?> 
                <?php echo $this->parseDate("H:i"$this->startTime); ?> Uhr
                   <?php endif; ?><?php endif; ?>
                   </span>
            </div>
    Geändert von marcohe (03.06.2017 um 21:19 Uhr)

  16. #16
    Contao-Fan
    Registriert seit
    20.10.2014.
    Ort
    Freiburg
    Beiträge
    477

    Standard

    #15 funktioniert übrigens nur wenn man calendar_extended verwendet.

    Contao Standard ist bei leerem Enddatum das Enddatum = dem Startdatum. Hier sieht das ganze dann folgendermaßen aus:

    PHP-Code:
    <span class="date">
    <?php if ($this->startDate && $this->endDate): ?> 
    <?php echo $this->parseDate("d.m."$this->startDate); ?> -
    <?php echo $this->parseDate("d.m.y"$this->endDate); ?>
    <?php 
    endif; ?> 
                   
    <?php if ($this->startDate && !$this->endDate): ?> 
    <?= date("d.m.y"$this->begin);  ?>
    <?php 
    endif; ?>
    </span>
                   
    <span class="time"> 
    <?php if ($this->addTime): ?>
    <i class="fa fa-clock-o" aria-hidden="true"></i>
    <?php if ($this->startTime != $this->endTime): ?> 
    <?php echo $this->parseDate("H:i"$this->startTime); ?> -  
    <?php echo $this->parseDate("H:i"$this->endTime); ?> Uhr
    <?php endif; ?> 
       
    <?php if ($this->startTime == $this->endTime): ?> 
    <?php echo $this->parseDate("H:i"$this->startTime); ?> Uhr
    <?php endif; ?><?php endif; ?>
                   </span>

  17. #17
    Contao-Urgestein Avatar von Andreas
    Registriert seit
    19.06.2009.
    Ort
    Mönchengladbach
    Beiträge
    7.703
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    $this->parseDate() funktioniert noch, wird aber weitergeleitet nach \Date::parse() https://github.com/contao/core/blob/...ystem.php#L896. Benutzt am besten direkt \Date::parse(). Ist jetzt nicht tragisch, nur der Korrektheit wegen. So sieht man auch direkt, dass die Methode parse() aus der Date-Klasse benutzt wird.
    Bitte!
    Vor Anfragen im Forum HTML validieren.
    Codesnippets hier im Froum sauber einrücken. Nur Tabs o. nur Leerzeichen verwenden.

    Vielen Dank an alle Wunschlistenerfüller
    Andreas Burg, Web Solutions

  18. #18
    Contao-Urgestein Avatar von tblumrich
    Registriert seit
    25.06.2009.
    Ort
    Feldberger Seenlandschaft
    Beiträge
    2.225
    Partner-ID
    7979
    User beschenken
    Wunschliste

    Standard

    Hallo!

    ich verwende Teile eurer Codeschnippsel für die Formatierung meiner Eventmodule. Ich habe eine Frage zur Ausgabe der Wochentage:

    In einem Template event_upcoming_1 verwende ich folgendes:

    Code:
    <span class="date">
    <?php if ($this->startDate && $this->endDate): ?> 
    <i class="fa fa-calendar" aria-hidden="true"></i>
    <?= \Date::parse("d.m.", $this->startDate); ?> -
    <?= \Date::parse("d.m.y", $this->endDate); ?>
    <?php endif; ?> 
                   
    <?php if ($this->startDate && !$this->endDate): ?> 
    <i class="fa fa-calendar" aria-hidden="true"></i>
    <?= date("l, d.m.y", $this->begin);  ?>
    <?php endif; ?>
    </span>
                   
    <span class="time"> 
    <?php if ($this->addTime): ?>
    <i class="fa fa-clock-o" aria-hidden="true"></i>
    <?php if ($this->startTime != $this->endTime): ?> 
    <?= \Date::parse("H:i", $this->startTime); ?> -  
    <?= \Date::parse("H:i", $this->endTime); ?> Uhr
    <?php endif; ?> 
       
    <?php if ($this->startTime == $this->endTime): ?> 
    <?= \Date::parse("H:i", $this->startTime); ?> Uhr
    <?php endif; ?><?php endif; ?>
                   </span>
    in einem anderen verwende ich

    Code:
    <?php
        $datumneu = "";
        if ($this->endDate==""): {
            $datumneu.=\Date::parse("l, j.n.Y", $this->startDate);
            if ($this->addTime!=""): {
                $datumneu.=", ".\Date::parse("H:i", $this->startTime);
                if ($this->endTime > $this->startTime): $datumneu.=" - ".\Date::parse("H:i", $this->endTime)." Uhr"; else: $datumneu.=" Uhr"; endif;
            } endif;
        } else: {
            $datumneu.=\Date::parse("l, j.n.Y", $this->startDate);
            if ($this->addTime!=""): {
                $datumneu.=", ".\Date::parse("H:i", $this->startTime)." Uhr - ";
                $datumneu.=\Date::parse("l, j.n.Y", $this->endDate);
                if ($this->endTime > $this->startTime): $datumneu.=", ".\Date::parse("H:i", $this->endTime)." Uhr"; endif;
            } else: {
                $datumneu.=" - ".\Date::parse("l, j.n.Y", $this->endDate);
            } endif;
        } endif; 
    ?>                 
            <time datetime="<?= $this->datetime ?>" class="date" itemprop="startDate"><?= $datumneu ?></time>
    Es wird also das "l" für die Wochentagsausgabe genutzt. Leider wird nur in zweiten Beispiel der Wochentag in Deutsch ausgegeben, im ersten Beispiel erfolgt die Ausgabe in englisch.

    Kann mir jemand sagen, warum das so ist und was ich dagegen tun kann?
    Danke!
    blucomp | Webdesign & Onlinelösungen

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •