PHP-Neuling: input type="date" und SQL in Chrome tt.mm.jjjj

Servus zusammen,

ich hoffe euch gehts allen soweit prächtig :)

Aufgrund von Browserumstellungen bin ich an ein Problemchen im Chrome und im Edge gestossen. Ich verstehe es aber leider nicht ganz.

Ich zeige eine Seite mit einer Tabelle, die sich etliche Daten aus einer Datenbank lädt. Mitunter auch Datumswerte. Diese sind in der SQL Datenbank als Datentyp DATE gespeichert, sodass auch danach sortiert werden kann. Funktioniert(e) soweit auch alles.

Also Grundsubstanz ist:

SQL Datenbank mit DATE Feld. Format im FELD YYYY-MM-DD input type im HTML als type="date"

Das Datum wird für den Browser so vorbereitet und aus der DB gezogen :

$dateANGEBOTSABGABE = new DateTime($Datensatz->KERN_ANGEBOTSABGABE);

im input feld möchte ich es dann so ausgeben lassen:

value="<?=$dateANGEBOTSABGABE->format('d.m.Y') ?>"

im entsprechenden Datensatz steht tatsächlich auch ein Datum, bspw. 2020-01-09

Trotzdem zeigt Chrome nur: tt.mm.jjjj Ich kann dann ein neues Datum abspeichern, aber das ist irgendwie nicht Sinn der Sache 3000 Einträge neu abzuspeichern.

Wo habe ich denn den Denkfehler?

Vg

  1. Hi,

    im input feld möchte ich es dann so ausgeben lassen:

    value="<?=$dateANGEBOTSABGABE->format('d.m.Y') ?>"
    

    im entsprechenden Datensatz steht tatsächlich auch ein Datum, bspw. 2020-01-09

    Trotzdem zeigt Chrome nur: tt.mm.jjjj

    Ich vermute mal, daß im value ein ISO-formatiertes Datum erwartet wird. Auch wenn das Anzeigeformat ein anderes sein soll.

    cu,
    Andreas a/k/a MudGuard

    1. hi das Problem war, dass ich den Wert nochmal auskodiert hatte

      			$dateANGEBOTSABGABE = new DateTime($Datensatz->KERN_ANGEBOTSABGABE);
      
      

      Das war gar nicht notwendig und hat mir wahrscheinlich das Format kaputt gemacht. Ich lasse den Wert jetzt direkt aus der DB lesen. Nun gibt auch Chrome das Feld korrekt aus.

      Ich meine, dass der Internet Explorer damit vorher Probleme hatte. Aber das ist ja nun kein Thema mehr.

      Vielen Dank euch. Auch an Rolf, der gerade wieder Beteiligung ausübt :)

      Vg

  2. ich bin blöd das konvertieren des Konverts war bescheuert ...

    Hat sich erledigt. Löschen Sie bitte alles, für immer 😀

    1. Hallo PHP-Neuling,

      Wo habe ich denn den Denkfehler?

      Um das nochmal aufzugreifen:

      • Der value-String eines input type="date" ist immer "YYYY.MM.DD", also ISO Format.
      • Der dargestellte String, für den User, ist davon unabhängig und wird basierend auf dem locale des Users angezeigt. D.h. ein US-Anwender sieht mm/dd/yyyy. Und das beeinflusst Du in einem type="date" nicht.
      • Das bedeutet auch, dass es zu Diskrepanzen kommen kann, wenn Du ein Datum am Server in einen String konvertierst. Du musst das locale des Anwenders kennen, um deine Dates so zu formatieren wie es der Browser des Anwenders im date-Feld tut. Dazu kann man den Accept-Language Header verwenden, den der Browser schickt, aber es kann eben auch schiefgehen. Ein HTML Element <output type="date"> wäre dafür hilfreich, aber das gibt's nicht.
      • In einer Datenbank sollte ein Datums-Attribut als DATE gespeichert werden, nicht als String.

      Rolf

      --
      sumpsi - posui - obstruxi
      1. Der dargestellte String, für den User, ist davon unabhängig und wird basierend auf dem locale des Users angezeigt. D.h. ein US-Anwender sieht mm/dd/yyyy. Und das beeinflusst Du in einem type="date" nicht.

        Danke. Das wusste ich nicht. Dann kann man sich das ganze konvertiere ja endlich komplett sparen.

        Bleibt gesund !

      2. Lieber Rolf,

        • Der value-String eines input type="date" ist immer "YYYY.MM.DD", also ISO Format.

        und ich dachte, es wären Minusse anstatt der Punkte. Ein Test ergab folgendes:

        <form>
          <input name="date" type="date">
          <button>los</button>
        </form>
        

        Zielseite: http://localhost/?date=2021-06-15

        Der Browser hat also nicht YYYY.MM.DD gesendet, sondern YYYY-MM-DD.

        Liebe Grüße

        Felix Riesterer

        1. Moin,

          • Der value-String eines input type="date" ist immer "YYYY.MM.DD", also ISO Format.

          und ich dachte, es wären Minusse anstatt der Punkte.

          in ISO 8601 ist das auch so, über Rolfs Schreibweise mit Punkten bin ich auch gestolpert.

          Live long and pros healthy,
           Martin

          --
          Fische, die bellen, beißen nicht.
          1. Hallo,

            oops. Natürlich. Sorry.

            Rolf

            --
            sumpsi - posui - obstruxi
      3. Hi there,

        • Der dargestellte String, für den User, ist davon unabhängig und wird basierend auf dem locale des Users angezeigt. D.h. ein US-Anwender sieht mm/dd/yyyy. Und das beeinflusst Du in einem type="date" nicht.

        Theoretisch ja. Scheint aber vom Browser abzuhängen. Kunden, die am Apple den Safari-Browser verwenden (keine Ahnung, wo die herkommen) erzählen mir immer wieder, daß der date-Type nicht funktioniert, weil der Browser auch intern (= javascript) das Format weiterverarbeitet, das der Kunde eingibt bzw. das vorgegeben ist...

        1. Hallo klawischnigg,

          Tante Google meint:

          Das dürfte daran liegen, dass Desktop-Safari den type="date" Input-Typ erst seit ein paar Wochen beherrscht (laut caniuse seit Version 14.1, die im April 2021 erschien).

          Und ein IE-Luser hat diesen input-Typ natürlich auch nicht.

          Ob der Browsersupport von type="date" als Progressive Enhancement durchgeht, wenn ein IE-User oder ein Prä-14.1 Safarist "2021-06-15" statt 15.06.2021 zu sehen bekommt?

          MDN empfiehlt hier Feature Detection:

             const test = document.createElement("input");
             try {
                test.type = "date";
             }
             catch (err) {
             }
             if (test.type == "text") { 
                // type="date" ist nicht supported
             }
          

          try/catch muss, weil der IE bei dieser Zuweisung einen Error wirft.

          Und wenn date nicht unterstützt wird, soll man 3 Eingabefelder machen. Was natürlich aufwändig ist. Und in MDN sehr lokalisierbar im TT MMM YYYY Format gemacht wird, mit englischen Monaten für MMM 🙄.

          Rolf

          --
          sumpsi - posui - obstruxi
          1. Hi there,

            Tante Google meint:

            Das dürfte daran liegen, dass Desktop-Safari den type="date" Input-Typ erst seit ein paar Wochen beherrscht (laut caniuse seit Version 14.1, die im April 2021 erschien).

            Ah, interessant. Ich selbst bin dem nicht nachgegangen, weil ich eine ausgeprägte Apple-Allergie habe und auch mein Kunde gemeint hat, daß er für Apple-Anwender keine Extrawürste bezahlt.

            Bleibt die Frage, warum ein Browserhersteller ein Feature um Jahre zu spät implementiert. Aber, wie gesagt, darum sollen sich andere kümmern...😉