Ankündigung

Einklappen
Keine Ankündigung bisher.

Excel-Formel übersetzen: wie vielter Wochentag ist ein Datum

Einklappen

Neue Werbung 2019

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

  • #16
    Hallo. Habe doch noch ein Problem. Auf meinem lokalen Server (XAMPP) ergibt die Funktion das richtige Ergebnis: Der erste Samstag im September ist der 01-09-2007. Lasse ich aber gleichen Code im Internet laufen wird eine Woche später ausgegeben: 08-09-2007.
    Wie kommt das bzw. woran kann das liegen? Irgendwelche globalen Einstellungen? Auch bei der 2. oder 3. Woche werden je 7 Tage zuviel angezeigt - zumindest online. Ist das bei Euch auch so?

    NACHTRAG - Muss wohl am Hoster liegen. Habe gleiches Skript bei 2 "großen" Anbietern getestet und da kommt das richtige Ergebnis raus. Mal sehen was der kleinere Hoster dazu sagt.


    Code:
    $test1 = "2007";
    $test2 = "9";
    $test3 = "Saturday";
    $test4 = "1";
    echo getDateByWeekday($test1, $test2, $test3, $test4);		//08-09-2007 im www

    Kommentar


    • #17
      Zitat von webazubi
      Ich glaube in der Funktion muss es statt 0 als Tagesangabe eher 1 heißen:
      Code:
      $firstWeekday = date('j', strtotime("next $weekday", mktime(0, 0, 0, $month, 1, $year)));
      Nein das war absichtlich 0.

      Egal was du für Daten berechnen möchtest, mit strtotime() und mktime() solltest du dich auskennen oder zumindest wissen, dass die Funktionen Potenzial haben, das man kennen sollte.
      Vor allem die User-Notes zu strtotime() sind sehr interessant.

      Kommentar


      • #18
        Zitat von Zergling
        Zitat von webazubi
        Ich glaube in der Funktion muss es statt 0 als Tagesangabe eher 1 heißen:
        Code:
        $firstWeekday = date('j', strtotime("next $weekday", mktime(0, 0, 0, $month, 1, $year)));
        Nein das war absichtlich 0.
        Hier noch ein Ergebnis, das mit der 0anstelle einer 1 ein falsches Ergebnis liefert: Gebe mir den 1. Montag im Mai.
        (Falsches) Ergebnis bei 0: 30.5.2007.
        Richtiges Ergebnis bei 1: 07.05.2007.

        Code:
        $jahr = "2007";
        $monat = "5";
        $tag = "Monday";
        $folge = "1";
        echo getDateByWeekday($jahr, $monat, $tag, $folge);
        
        function getDateByWeekday($year, $month, $weekday, $count)
        {
        $firstWeekday = date('j', strtotime("next $weekday", mktime(0, 0, 0,$month, 0, $year)));
        $requestedDay   = $firstWeekday + ($count - 1) * 7;
        return date('Y-m-d', mktime(0, 0, 0, $month, $requestedDay, $year));
        }
        Beziehungsweise das richtige Ergebnis mit der 1 statt 0:
        Code:
        function getDateByWeekday($year, $month, $weekday, $count)
        {
        $firstWeekday = date('j', strtotime("next $weekday", mktime(0, 0, 0,$month, 1, $year)));
        $requestedDay   = $firstWeekday + ($count - 1) * 7;
        return date('Y-m-d', mktime(0, 0, 0, $month, $requestedDay, $year));
        }
        Gibt es dafür vielleicht eine mathematische Regelmäßigkeit, dass bei bestimmten Tagen (
        - gerade/ungerade?,
        - einstellig/zweistellig?
        - Monatswechsel am Wochenende?)
        die eine oder andere Funktion genommen werden muss?

        Kommentar


        • #19
          Scheint versionsabhängig zu sein, PHP 5.2.3 liefert bei 0 das korrekte Ergebnis 2007-05-07, PHP 4.4.7 liefert fälschlicherweise 2007-04-30. Gegebenenfalls musst du die Parameter von mktime() eben versionsabhängig setzen oder das Endergebnis um eine Woche verlängern.
          Oder du machst das ganze nicht mit "next $weekday".

          Kommentar


          • #20
            Habe es jetzt so gelöst, sicherlich etwas kompliziert, aber dafür bislang verlässlich:
            Ausgangslage ist ein Startdatum, aus dem ich ermittel, welcher Wochentag und der wievielte Wochentag das in dem Start-Monat ist.
            Über eine while-Schleife zähle ich ab diesem Tag immer 7 Tage dazu, bis ich auf das heutige Datum (+1 Monat drauf) komme.
            Zu jedem dieser 7-Tage berechne ich mit folgender Formel, um den wievielten Wochentag es sich dabei im Monat handelt.
            a) Ermittel den letzten des Vormonats:
            b) Subtrahiere das (7-Tage-)Datum der Schleife vom Vormonatsletzen (in Tagen) = $difftage
            c)
            Code:
            floor(($difftage+6)/7)
            Heraus kommt beispielsweise für das Suchdatum "7-5-2007" eine "1" für den ersten Montag im Mai.
            Da ich mein Array gleich für die nächsten Wochen ab heute gefüllt habe, kann ich nun sagen: Gib mir im Monat "09" das Datum wo die Wochentagsnummer stimmt und wenn dieses Datum bereits vorbei ist, nimm das im nächsten Monat.

            Kommentar

            Lädt...
            X