Ankündigung

Einklappen
Keine Ankündigung bisher.

zweistellige Jahreszahl in Timestamp umwandeln

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • zweistellige Jahreszahl in Timestamp umwandeln

    Guten Morgen,

    PHP-Code:
    date_default_timezone_set("Europe/Berlin");
    $meindatum "1.11.20";
    $timestamp strtotime($meindatum);
    $ausgabe date('d.m.Y'$timestamp);
    echo 
    $ausgabe
    liefert mir als Datum den 10.10.2020. Setze ich $meindatum auf "1.11.2020" klappt alles prima. Da es sich bei $meindatum um eine User-Eingabe handelt und eben nicht jeder User das Datum vierstellig eingibt, muss PHP die Jahreszahl auf vierstellig bringen.

    Hat da einer eine colle Idee?

    AS

  • #2
    Mache es halt richtig, dann gibt es das Problem nicht.
    Tipp lesen und nachmachen: https://developer.mozilla.org/en-US/...ent/input/date

    Kommentar


    • #3
      Zitat von ASenna Beitrag anzeigen
      liefert mir als Datum den 10.10.2020. Setze ich $meindatum auf "1.11.2020" klappt alles prima. Da es sich bei $meindatum um eine User-Eingabe handelt und eben nicht jeder User das Datum vierstellig eingibt, muss PHP die Jahreszahl auf vierstellig bringen.
      Das ist nicht möglich.

      1.11.20 kann sein:

      1. November 2020
      11. Jänner 2020
      20. November 2001

      Alle drei Varianten sind richtig. Soll PHP jetzt erraten, welche gemeint ist?

      Zitat von ASenna Beitrag anzeigen
      Hat da einer eine colle Idee?
      Ein bestimmtes Datumformat festlegen, das verwendet wird.

      Kommentar


      • #4
        Du solltest deine Eingaben in Anlehnung an gültige Normen machen lassen und keine zweistellige Jahreszahlen als Nutzereingabe zulassen!

        Kommentar


        • #5
          Danke für die Hinweise, insbesondere an Hellbringer.Das Datum kommt leider nicht über ein Inputfeld, sonst könnte man hier gleich disziplinierend einwirken. Ich habe das jetzt so gelöst:

          PHP-Code:
          $output preg_split"/[;,\/.-]/"$datum ); 
          da sicher ist, dass das Datum in der Reihenfolge Tag - Monat - Jahr eingegeben wird. Beim Trennzeichen kann ich mir dann schon wieder nicht mehr so sicher sein.

          AS

          Kommentar


          • #6
            Und was hast du mit den splitten gewonnen? Du hast so gut wie keine Prüfung des Formats. Für so etwas gibt es DateTime::createFromFormat.

            PHP-Code:
            $input '1.11.20';

            $dateTime DateTime::createFromFormat('!d#m#y',$input); 
            Mit $dateTime kannst du im Erfolgsfall weiterarbeiten. Im Fehlerfall ist $dateTime === false .

            PHP-Code:
            if($dateTime){
              
            $timeStamp $dateTime->getTimestamp();

            }
            else {
              
            //error


            Kommentar


            • #7
              Mensch, PHP hat auch wirklich für alles eine Funktion. Cooler Tipp. Danke!

              Kommentar


              • #8
                @jspit: Ich habe das jetzt mal umgesetzt, muss aber leider feststellen, dass es den Datumsstring nicht sicher umsetzt. Denn denn jemand als Datum "1.11.2020" eingibt, liefert die Funktion den Wert false, weil halt das Jahr zweistellig erwartet wird.

                Kommentar


                • #9
                  Dann nimm eben Y statt y und schau ins Handbuch was da rauskommt.

                  Da kommt dann bei einem 2stelligen Jahr 0020 raus wenn man 1.11.20 eingibt. Da muss man dann halt entscheiden ob man daraus 1920 oder 2020 macht.
                  Das heisst 1900 oder 2000 zum Jahr hinzuaddieren.

                  Bevor du dir nun die Finger wund tippst habe ich mal das Beispiel von jspit angepasst.

                  PHP-Code:
                  <?php
                  date_default_timezone_set
                  ("Europe/Berlin");

                  // Beispieldaten zum testen
                  $checkdate[] = "1/11/19";
                  $checkdate[] = "1-11-20";
                  $checkdate[] = "1;11;30";
                  $checkdate[] = "1.11.31";
                  $checkdate[] = "1(11)2032";
                  $checkdate[] = "1,11,2022";
                  $checkdate[] = "1'11'20";

                  $format '!d#m#Y';

                  foreach( 
                  $checkdate as $valdate ){

                      
                  $date DateTime::createFromFormat($format$valdate);

                      if ( 
                  $date ){

                          
                  $year $date->format("Y");
                          
                  // hier wird das Jahr getrennt anhand des aktuellen Jahres
                          
                  $yeardivider date_create()->format("y");

                          if ( 
                  $year 100 ){

                              if (
                  $year $yeardivider$date->add(new DateInterval('P2000Y'));
                              if (
                  $year >= $yeardivider$date->add(new DateInterval('P1900Y'));

                          }

                          echo 
                  $valdate " -> " $date->format("Y-m-d") . "<br>\n";

                      }else{

                          echo 
                  $valdate " -> falsches Datumsformat";
                      }
                  }

                  Kommentar


                  • #10
                    PHP-Code:
                    $dateTime DateTime::createFromFormat('!d#m#y',$input)
                             ?: 
                    DateTime::createFromFormat('!d#m#Y',$input); 
                    ASenna Aber ein solches Chaos an möglichen Formaten macht keinen Sinn. Auf der einen Seite sprichst du von Usereingaben und dann das du darauf "nicht disziplinierend einwirken" kannst?

                    Kommentar


                    • #11
                      Die Frage ist halt welches Datum.. Gerade bei zB Geburtsdatum kann beides zutreffen 1920 oder 2020.. Gibt ja Leute die > 100 werden. D.h. mit nur 2 Stellen ist es gegebenfalls einfach nicht sicher lösbar. Oder wenn man historische Ereignisse erfasst, da geht sowieso viel mehr von der Bandbreite, ....

                      Da es sich bei $meindatum um eine User-Eingabe handelt
                      Du könntest:

                      1. einen Datepicker anbieten, der dir das korrekte Format dann schon automatisch einsetzt

                      2. Verpflichtend dem User ein Datum vorgeben das man 10.10.2020 weil es von der Eingabe in dem Format halt gewohnter ist und das dann per PHP wie oben schon angerissen umwandeln in YYY-MM-DD für deine Verarbeitung. Bzw. es gibt auch das placeholder Attribut wo du das gewollte Format anzeigen könntest.
                      "Datum (TT.MM.JJJJ): [_______]"
                      "Datum: [(TT.MM.JJJJ)]"

                      3. Einen Fehler bringen wenn es nicht dem Pattern entspricht, das kann mittlerweile sogar HTML selbst.
                      zB: https://stackoverflow.com/questions/...ate-mm-dd-yyyy

                      4. Und (zusätzlich) man kann auch PHP seitig mit Regex das Pattern prüfen und wenn es dem nicht entspricht (2 statt 4 stelliger Jahreszahl) einen Fehler ausgeben.

                      ...

                      Oder, wenn man auf "automagie" steht, kannst du auch sowas nachbauen, also den Teil mit den erlaubten mehreren Eingabe-Schemata: https://www.php.de/forum/webentwickl...79#post1036679

                      LG
                      The string "()()" is not palindrom but the String "())(" is.

                      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                      PHP.de Wissenssammlung | Kein Support per PN

                      Kommentar


                      • #12
                        Zitat von hausl Beitrag anzeigen
                        3. Einen Fehler bringen wenn es nicht dem Pattern entspricht, das kann mittlerweile sogar HTML selbst.
                        zB: stackoverflow.com[…]
                        das pattern-Attribut ist unnötig. Einfach ein input mit type=date verwenden, dann wird das Datum im Format YYYY-MM-DD vom Browser übergeben und der User bekommt es je nach Einstellungen auf seinem Rechner entsprechend formatiert dargestellt (in DE als DD.MM.YYYY).

                        Kommentar


                        • #13
                          tk1234
                          So weit waren ja schon. Siehe meinen Beitrag in #2 und schaue dir seine, die vom TE, Antwort in #5 an.

                          Deshalb ja das Merkwürdige. Er spricht zwar von Benutzereingaben, aber er selbst kann es nicht ändern, oder bekommt es so vorgesetzt.

                          Kommentar


                          • #14
                            Zitat von protestix Beitrag anzeigen
                            Deshalb ja das Merkwürdige. Er spricht zwar von Benutzereingaben, aber er selbst kann es nicht ändern, oder bekommt es so vorgesetzt.
                            Stimmt, du hast Recht, allerdings bringen deine Vorschläge dann wohl auch nichts. Das sinnvollste wäre wohl wenn der TE mal die Rahmenbedingungen offenlegen würde also schreiben würde wo die Daten jetzt eigentlich genau herkommen (woher wenn nicht über ein input?) …

                            Kommentar


                            • #15
                              Zitat von tk1234 Beitrag anzeigen
                              Das sinnvollste wäre wohl wenn der TE mal die Rahmenbedingungen offenlegen würde…
                              In der Tat.
                              hausl hat es ja schon angesprochen, wir wissen ja auch nicht um was für ein Datum es sich handelt, ein Geburtsdatum muss eben anders behandelt werden, wie ein Eintrittsdatum zu einem Verein, beides liegt zwar in der Vergangenheit aber ein 2stelliges Jahr ist da sonst nur in die Glaskugel schauen.

                              Und was hinzukommt, ist die Variabilität, wenn es heute gültig ist ist es im nächsten Jahr dann auch noch?



                              Kommentar

                              Lädt...
                              X