Der_Robert: Teilstrings vertauschen?

Hi zusammen,

wie kann ich eine Stringvariable der Form

$date_alt = "20070830";

in

$date_neu = "30.08.2007"

umkonstruieren?  Ich habe mir schon die ganzen Stringfunktionen angeschaut, doch es ist keine dabei, die passt. Vielleicht hatte schon jemand ein ähnliches Problem.

Danke für eure Hilfe
Robert

  1. Hallo,

    Ich habe mir schon die ganzen Stringfunktionen angeschaut, doch es ist keine dabei, die passt.

    Ach, nich wahr?!

    Nimm's auseinander (4, 2, 2) mithilfe der Funktion substr und setze es wieder zusammen.

    Oder naja, konvertiere es in ein Datum und wieder zurück. Bzw. warum verwendest du Datumswerte als Zeichenketten?

    Gruss, Frank

  2. Hello,

    wie kann ich eine Stringvariable der Form

    $date_alt = "20070830";

    in

    $date_neu = "30.08.2007"

    Man könnte was wildes mit unpack() und list() basteln.
    Aber bei einem sooo klaren Fall sollte doch Substring() für Dich vollkommen ausreichend sein!

    http://www.php.net/manual/en/function.unpack.php
    http://www.php.net/manual/en/function.list.php
    http://www.php.net/manual/en/function.substr.php

    $date_neu = substr($date_alt,6,2).'.'.substr($date_alt,4,2).'.'.substr($date_alt,0,4);

    Und wenn Du das öfter benötigst, verpackst Du es Dir in einer eigenen Funktion:

    function date_ansi_to_german($date)
        {
            if ($type($date) != 'string') return false;
            if (strlen($date) != 6 and strlen($date) != 8) return false;

    ## von 700101 bis 991231 soll 19Hundert angenommen werden
            ## von 000101 bis 691231 soll 20Hundert angenommen werden

    ## Dann fehlt hier noch die Validierung des Datums!

    if (strlen($date) == 6 and intval(substr($date,0,2)) < 70)
            {
                $date = '20'.date;
            }
            else
            {
                $date = '19'.date;
            }

    date = substr($date,6,2).'.'.substr($date,4,2).'.'.substr($date,0,4);

    return $date;
        }

    Liebe Grüße aus Syburg bei Dortmund

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  3. die wohl vernünftigste methode ist substr (zum zerlegen deines strings), mktime (zum konvertieren deines timestamps) und strftime (zum ausgeben der zeit in einer korrekten form)

    somit bist du nicht an die 30.08.2007 schreibweise gebunden

  4. Hallo!

    Da ich heute überall meinen Senf dazugebe, hier noch eine Möglichkeit:

    $date='20080112';  
      
    if (ereg ("([0-9]{4})([0-9]{1,2})([0-9]{1,2})", $date, $regs)) {  
        $date="$regs[3].$regs[2].$regs[1]";  
    } else {  
        echo "Invalid date format: $date";  
    }  
      
    echo $date;
    

    Ergebnis: 12.01.2008

    Kann man auch leicht eine Funktion draus machen.

    Gruß
    Roland

    1. Da ich heute überall meinen Senf dazugebe, hier noch eine Möglichkeit:

      meiner ansicht nach aber nur eine "halb-gute"

      Kann man auch leicht eine Funktion draus machen.

      es gibt zur datumsformatierung bereits fertige funktionen - zwar gibt es keinen konkreten datentyp für zeit/datum, aber dennoch sollte man zeit/datum in php idealerweise nur mit den dafür vorgesehenen funktionen behandel - wenn man aus deinen string nun "12. Januar 2008" oder "12. Jänner 2008", 12.1.2008 oder "2008, January 12" machen möchte musst du selbst etwas programmieren was php selbst schon vorsieht - die von mir genannte funktion strftime

      dass das zerlegen der zahlen mittels regulärem ausdruck ist wesentlich schlauer als die bisher genannten varianten mit substr - aber ereg ist nicht wirklich zeitgemäß - hier sollten auf jeden fall perl-kompatible funktionen verwendet werden

    2. Hallo Roland,

      dein Muster taugt nichts, rein, absolut, ganz und gar nichts, null Komma Periode null.

      Es ist nicht zwingend notwendig den gesunden Menschenverstand auszuschalten, wenn man Reguläre Ausdrücke anwendet.
      Ich bin sogar der felsenfesten Überzeugung, dass gesunder Menschenverstand zwingende Voraussetzung ist.

      Gruß Uwe

      1. Hello,

        dein Muster taugt nichts, rein, absolut, ganz und gar nichts, null Komma Periode null.

        Bitte erkläre es sachlich und zeige uns, wo die Fehler sind.

        Liebe Grüße aus Syburg bei Dortmund

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hallo Tom,

          Bitte erkläre es sachlich und zeige uns, wo die Fehler sind.

          mein sachlicher Ratschlag war und ist, vergiss Reguläre Ausdrücke und fang an zu denken.

          Gruß Uwe

      2. Hallo amolip!

        Das ist ja wirklich ein netter Beitrag.

        Kuck Dir mal hier das Example #1 an: http://de.php.net/manual/en/function.ereg.php

        Vielleicht solltest Du das auch auf www.php.org posten, die sind sicher auch an deiner Meinung interessiert.

        Gruß
        Roland

        1. Kuck Dir mal hier das Example #1 an: http://de.php.net/manual/en/function.ereg.php

          wie schon in meinem anderen beispiel erwähnt: das ganze ist zwar schlau ausgelesen, aber einer seits ist die funktion selbst langsam und sollte dringend durch preg_match ersetzt werden, anderseits sollte die ausgabe von datum/zeit-geschichten stehts als mit einer dafür vorgesehenen funktion erfolgen und nicht einfach als manuell zusammengesetzter string

          Vielleicht solltest Du das auch auf www.php.org posten, die sind sicher auch an deiner Meinung interessiert.

          ich würds eher bei php.net versuchen ;)

          1. Hello,

            Kuck Dir mal hier das Example #1 an: http://de.php.net/manual/en/function.ereg.php

            wie schon in meinem anderen beispiel erwähnt: das ganze ist zwar schlau ausgelesen, aber einer seits ist die funktion selbst langsam und sollte dringend durch preg_match ersetzt werden, anderseits sollte die ausgabe von datum/zeit-geschichten stehts als mit einer dafür vorgesehenen funktion erfolgen und nicht einfach als manuell zusammengesetzter string

            Hier ist aber nichts zu "matchen", da die Daten als Positionsdaten vorliegen und nicht als Muster.

            Die Formate

            YYYY-MM-DD _oder_
              YY-M-D     _oder_
              YY-MM-D    _oder_
              YYYY-M-DD  _oder_ ...

            gibt dann allerdings schon Anlass zum "matchen", denn da sind ja die Positionen nicht mehr bekannt!

            ich würds eher bei php.net versuchen ;)

            Liebe Grüße aus Syburg bei Dortmund

            Tom vom Berg

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. gibt dann allerdings schon Anlass zum "matchen", denn da sind ja die Positionen nicht mehr bekannt!

              hast du schon jemals einen benutzer gesehen, der exakt das eingibt, was daneben als vorgabe im textfeld steht? ;) genau das lässt sich damit abfangen

              1. Hello,

                gibt dann allerdings schon Anlass zum "matchen", denn da sind ja die Positionen nicht mehr bekannt!

                hast du schon jemals einen benutzer gesehen, der exakt das eingibt, was daneben als vorgabe im textfeld steht? ;) genau das lässt sich damit abfangen

                Von "Benutzer" war hier nicht die Rede und "genau das" (Benutzereingaben) lässt sich daruch auch nicht "abfangen"... Die müsste dann erst einmal durch ein intensives Filter laufen und dem Benutzer in unmissverständlicher Form, z.B. "Jahr: 1999, Monat: Juli, Tag: 02" wieder vorgelegt werden.

                Das würde sogar ein Engländer verstehen, für den es ja keine andere Sprache neben seiner gibt...

                Liebe Grüße aus Syburg bei Dortmund

                Tom vom Berg

                --
                Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de
                1. Das würde sogar ein Engländer verstehen, für den es ja keine andere Sprache neben seiner gibt...

                  nein, das mit der sprache sind hauptsächlich franzosen ;)
                  die amerikaner sind übrigens die, die sich nicht ans metrische system (bzw si-einheiten allgemein) halten wollen und auch sonst noch ganz eigene schreibweisen für verschiedenste dinge verwenden

        2. Hallo Roland,

          Das ist ja wirklich ein netter Beitrag.

          ja, hört sich nicht schön an, aber es ist einfach ärgerlich, wenn jemand nicht darüber nachdenkt, was er tut.

          The following code snippet takes a date in ISO format (YYYY-MM-DD)

          So wie in dem Beispiel auf php.net. Da fällt mir nur noch ein, "denn sie wissen nicht, was sie tun". Die Ironie, die böse Ironie, ist, die Aussage ist nicht einmal falsch.

          Auch an dich den Ratschlag, vergiss Reguläre Ausdrücke und fang an zu denken.

          Worum geht es bei einem Regulären Ausdruck? Darum etwas zu beschreiben, nämlich das (abstrakte) Wesen (konkreter) Erscheinungen. Du hast 'ne Eiche, 'ne Buche, 'ne Erle, usw. als konkrete Erscheinungen und musst beschreiben was ein Baum ist, also das (abstrakte) Wesen dieser konkreten Erscheinungen.

          Das ist nicht leicht, das ist schwer, sogar höllisch schwer. Beschreib doch mal, was ein Baum, ein Auto, usw. ist.

          Wenn du einen Regulären Ausdruck entwirfst, dann beschreibst du das Wesen von Erscheinungen, das letzte, das allerletzte, was du benötigst, um einen Regulären Ausdruck zu entwerfen, sind Reguläre Ausdrücke.

          Du musst in der Lage sein, dies verbal zu beschreiben, das ist schwer und eine verbale Beschreibung hat auch immer mehr oder weniger große Unschärfen. Du musst eine Vorstellung von den Erscheinungen und dem Wesen entwickeln.

          Wenn du das nun verbal einigermaßen beschrieben hast, dann kannst du das in eine formale Sprache, wie Reguläre Ausdrücke, übersetzen, dabei sollten dann auch die letzten Unschärfen flöten gehen. Die Formulierung eines Regulären Ausdruckes ist also in allerallererster Linie nur eine "Übersetzung" eines von dir verbal beschriebenen Musters. Wie gesagt, du musst absolut nichts von regulären Ausdrücken wissen, um einen Regulären Ausdruck zu entwickeln.

          Und bei der Analyse eines Musters gehst du umgekehrt vor, du übersetzt die formale Sprache in die verbale. Mach das doch mal mit deinem Muster. Ich helfe dir gerne bei Problemen der verbalen Beschreibung, wenn du erst eine verbale Beschreibung hast, brauchst du keine Hilfe mehr, denn das bisschen übersetzen kannst du alleine.

          Gruß Uwe

          1. Hallo Roland,

            The following code snippet takes a date in ISO format (YYYY-MM-DD)

            So wie in dem Beispiel auf php.net. Da fällt mir nur noch ein, "denn sie wissen nicht, was sie tun". Die Ironie, die böse Ironie, ist, die Aussage ist nicht einmal falsch.

            ein Nachtrag: Da habe ich auf die Schnelle eine Kleinigkeit übersehen. Das Beispiel ist schon in Ordnung, wenn es auch nicht genau zur verbalen Beschreibung passt, aber das schreibe ich jetzt mal der üblichen verbalen Unschärfe zu.

            Das ändert nichts daran, dass _dein_ Beispiel Humbug ist.

            Gruß Uwe

        3. Hallo,

          Kuck Dir mal hier das Example #1 an: http://de.php.net/manual/en/function.ereg.php

          Hab's mir angeguckt. Ein Beispiel ohne realen Nutzen: der 35. Mai (beispielsweise 2008-05-35) ist ein Kinderbuch von Erich Kästner, aber kein zulässiges Datum.

          Wenn schon RegExp, dann richtig :-)

          Freundliche Grüße

          Vinzenz

  5. Ich denke damit hättest Du nicht gerechnet:

    $date_neu = sprintf('%02d.%02d.%04d', $date_alt % 100, $date_alt % 10000 / 100, $date_alt / 10000);

    PS: Der 99.99.9999 ist übrigens kein Montag 8)

    1. Hallo,

      PS: Der 99.99.9999 ist übrigens kein Montag 8)

      aber der 35.05. eines nicht näher spezifizierten Jahres fiel auf einen Donnerstag :-)

      Freundliche Grüße

      Vinzenz