Ankündigung

Einklappen
Keine Ankündigung bisher.

strtotime() funktioniert nicht mehr?

Einklappen

Neue Werbung 2019

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

  • strtotime() funktioniert nicht mehr?

    Hallo zusammen!

    Ich habe mich neu hier angemeldet in der Hoffnung, etwas Hilfe zu bekommen bei einem PHP-Problem. Zu meiner PHP-Erfahrung: Ich bin selbst kein erfahrener Programmierer, kann mir aber meine Code-Schnipsel zusammen sammeln und umbauen, wie ich es brauche.

    Also, es geht um ein WordPress-Plugin, welches ich im Frühjahr in Auftrag gab. Das Plugin ist ziemlich simpel, und der WordPress-Teil des Codes funktioniert auch super.
    Die Aufgabe dieses Skript ist, dass es sich per Knopfdruck aufrufen und lässt und dann einen RSS-Feed einliest.
    Wenn Feed-Einträge gefunden werden (erzeugt seit dem letzten Aufruf des Skripts; Zeitstempel wird in Datenbank abgelegt), dann werden diese Einträge einer nach dem anderen in eine Liste in einem WP-Artikel geschrieben.
    Alle Feed-Einträge eines Tages erscheinen in einer Liste eines einzigen Artikels. Einträge eines anderen Tags erscheinen in einem anderen Artikel.

    Die gute Nachricht: dieses Skript funktionierte einmal einwandfrei.
    Die schlechte Nachricht: plötzlich funktioniert das Skript nicht mehr, obwohl ich es nicht angefasst habe.

    Gut wiederum ist, dass ich den Fehler vermutlich gut eingekreist habe. Aber ich kann ihn nicht selbst beheben.
    So, jetzt gibt es mal etwas Code. Momentan geht es mir um den Teil mit dem Datum:
    PHP-Code:
    $pubDate strtotime(date('d.m.Y',strtotime($item->pubDate)));
    echo 
    "DEBUG: Variable \$item->pubDate = " $item->pubDate "<br>"
    Das war mir zu sehr ineinander verschachtelt, dass ich den Überblick verliere.
    Ich habe es daher in verschiedene Teil-Abschnitte zerlegt:
    PHP-Code:
    $feedstring "Wed, 29 Okt 2014 17:08:16 EDT ";  // Beispiel aus dem RSS Feed
    echo "Variable \$feedstring = " $feedstring "<br>";
    $feedstringtotime strtotime($feedstring);
    echo 
    "Variable \$feedstringtotime = " $feedstringtotime "<br>";   // leer
    $datestring date('d.m.Y',$feedstringtotime);
    echo 
    "Variable \$datestring = " $datestring "<br>";   // 01.01.1970
    $datestringtotime strtotime($datestring);   
    echo 
    "Variable \$datestringtotime = " $datestringtotime "<br>";   //  0 
    Ich habe ein wenig gebraucht, um hinter das Konzept dieser verschachtelten Umwandlungen zu steigen:
    1) Das Quell-XML des RSS-Feeds enthält einen String, der eine Zeitinformation beinhaltet. Und zwar wie im Beispiel zu sehen inklusive Uhrzeit, Zeitzone etc.
    2) strtotime() macht einen Unix-Zeitstempel daraus.
    3) date() schreibt diesen wieder zurück in einen String, aber nur noch als Datum ohne Uhrzeit
    4) dann kommt das zweite strtotime(), um daraus nun erneut einen Unix-Zeitstempel für dieses Datum (bei 00:00:00 Uhr) zu bekommen. Unabhängig von der Uhrzeit haben nun alle Feedeinträge eines Tages den exakt gleichen Zeitstempel.


    Der Fehler ist, dass der Eintrag im Feed sich anscheinend nicht von strtotime() verarbeiten lässt. (die Kommentare oben ensprechen den Ausgaben des Skripts).
    Wenn ich mir das Datum anschaue, dann sehe ich auch folgende Ungereimtheiten:
    a) "Wed" und "Okt" (eins Englisch, eins Deutsch abgekürzt)
    b) Leerzeichen am Ende (vermutlich egal)
    c) EDT ist die Sommerzeit an der US-Ostküste. Der Server läuft aber in Deutschland???


    Wie bereits gesagt, es funktionierte bis vor 4-6 Wochen noch alles. Irgendwann ist etwas kaputt gegangen. Bei meinem Provider Webhostone gab es Ende September eine Umstellung auf eine höhere Debian-Version. Kann da etwas geändert worden sein, was solche Auswirkungen hat?


    Ich bin über jede Idee wirklich froh, da ich nun mit meinem Latein am Ende bin.

    Vielen Dank vorab!

    Gruß,
    Marcus

  • #2
    Das ist in der Tat ein sehr graußliger Timestring. Von wo rufst du denn die Feeds ab, bzw hast du Einfluss auf deren Inhalt, oder ließt du nur den Inhalt und speicherst ihn ab?
    Homepage: www.jplace.de

    Github: JohnnyDevNull

    Kommentar


    • #3
      Dieser Feed kommt aus einer webbasierten Software für Ahnenforschung, die sich auch auf meinem Server befindet.
      Das ist kommerziell, ich könnte aber den Entwickler mal um Rat fragen.
      Bisher war ich mir halt nicht sicher, ob oder ob nicht dieser String in Ordnung sei.

      Danke.

      Kommentar


      • #4
        PHP-Code:
        $feedstring "Wed, 29 Okt 2014 17:08:16 EDT ";  // Beispiel aus dem RSS Feed 
        Könntest versuchen dir den String mit date_create_from_format() einzulesen, aber was ich sehr selstam finde ist, das der Monat Okt ist statt Oct. Dh es wird hier im String deusch und englsich (Wed) gemischt. Das müsst man vorher in der englische Äquivalent replacen, dann müsste das schon gehen. Ev. reicht das dann (und ev. noch einem trim() wegen dem Leerzeichen hinten) so auch schon for strtotime.

        Aber das ist halt enorme Flickschusterei und da sollte man echt mal den Ersteller dieses Formates darauf aufmerksam machen.

        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


        • #5
          Ja, scheint der Monat zu sein - hier mit Okt statt Oct:

          PHP-Code:
          $sDate 'Wed, 29 Oct 2014 17:08:16 EDT ';
          $x strtotime($sDate);
          echo 
          date("Y-m-d H:i:s"$x);
          // 2014-10-29 22:08:16 
          Machst dir zwei Arrays mit englischen und deutschen und ersetzt vor strtodate(). Aber wie gesagt Flickschusterei!
          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


          • #6
            Habe ich heute Vormittag schon erledigt. Komisch ist aber, dass es erst neulich aufgetreten ist und vorher ja klappte.

            Ich habe übrigens noch ein weiteres Plugin, welches ein Datum aus MySQL liest und ausgeben soll. Das wirft mir zur Zeit auch nur 01.01.1970 aus, obwohl die Datenbank richtig gefüllt ist.

            Ich habe meinen Hoster in Verdacht, aber mir fehlt die Fantasie, was da bei ihm falsch konfiguriert sein könnte.
            Jedenfalls tauchen die Fehler erst auf, seit er Ende September ein Update auf Debian Wheezy gemacht hat. (Bilde mir das zumindest ein)

            Alle Skripte (meine und die kommerziellen) wurden über Monate nicht geändert und funktionierten früher mal.


            Vielen Dank, Gruß,
            Marcus

            Kommentar


            • #7
              Zitat von marcuszurhorst Beitrag anzeigen
              Ich habe meinen Hoster in Verdacht, aber mir fehlt die Fantasie, was da bei ihm falsch konfiguriert sein könnte.
              Jedenfalls tauchen die Fehler erst auf, seit er Ende September ein Update auf Debian Wheezy gemacht hat. (Bilde mir das zumindest ein)

              Alle Skripte (meine und die kommerziellen) wurden über Monate nicht geändert und funktionierten früher mal.


              Vielen Dank, Gruß,
              Marcus
              Klingt nach eine logischen Schlussfolgerung. Eventuell könntest du mal nachschauen wie bei deinem Ahnendings der Timestring generiert wird. Würde mich zumindest interessieren wie sowas dabei rauskommen kann, sofern es nicht an dem debian wheezy liegt.
              Homepage: www.jplace.de

              Github: JohnnyDevNull

              Kommentar

              Lädt...
              X