Stefan Bechtold: Funktion um das Datum zu einer Kalenderwoche zu bestimmen

Hallo Forum,

ich suche eine Funktion, die an mktime() anlehnt. Ich möchte nur nicht den Tag, den Monat und das Jahr übergeben, sondern nur das Jahr, die Kalenderwoche und den Wochentag. Die Zeitübergabe soll identisch sein.

function mktimefromkw($kw, $wday, $jahr, $stunde, $minute, $sekunde) {
  // hier sollten die Routinen stehen...
  // Ich möchte bitte keine langen Schleifen, da ich
  // diese Funktion sehr oft auf einer Seite einbinden muss.

// Rückgabewert sollte ein Timestamp sein.
  return $unix_timestamp;
}

Ich danke für Eure Hilfe.

Gruss Stefan

  1. Moin Stefan:
    Die Art Deiner Frage, läst nur eine Antwort zu.
    Du hast Dir nicht einmal Ansatzweise die Mühe gamacht selber eine Lösung zu finden.
    Bitte bis zum Ende scrollen.
    Also Hurtig Hurtig:

    Die elf Gebote des SELF-Forums

    date ()lautet Dein Wink mit dem Zaunpfahl:

    1. Hast du meine Frage überhaupt verstanden?
      Ich habe nur gefragt ob jemd. schon ein fertiges Script hat, da ich einfach keine Lust habe eines zu coden! ;o) Ich hab hier noch so viel zu tun und ich will daher ein paar Sachen ausm Netz kopieren.

      PS: Date wirft mir die Kalenderwoche zu einem Datum zurück!
      Ich brauch das aber genau andersherum und möchte dafür nach möglichkeit keine lange schleife nutzen, weil das bei den vielen funktionsaufrufen zu lange dauert..

      also nicht...

      $jahr = date("Y");
      $time = mktime(0,0,0,$jahr,0,0); //oder verdreht?!
      while(true) {
        $this_kw = date("W", $time+=60*60*24);
        if($this_kw == $kw) {
          break;
        }
      }

      return time;

      soll schon bisschen anspruchsvoller sein!

      Gruss Stefan

      1. Hast du meine Frage überhaupt verstanden?
        Ich habe nur gefragt ob jemd. schon ein fertiges Script hat, da ich einfach keine Lust habe eines zu coden! ;o) Ich hab hier noch so viel zu tun und ich will daher ein paar Sachen ausm Netz kopieren.

        PS: Date wirft mir die Kalenderwoche zu einem Datum zurück!
        Ich brauch das aber genau andersherum und möchte dafür nach möglichkeit keine lange schleife nutzen, weil das bei den vielen funktionsaufrufen zu lange dauert..

        Ich verstehe Dein Problem wirklich nicht:
        Du hast eine Kalenderwoche und ein Jahr?
        Und dur brauchst die "gültigen" Datumsangaben?
        Also im Prinzip sieben gültige Lösungen und das ganze ohne Schleife?
        T
        omIRL

        1. Ich verstehe Dein Problem wirklich nicht:
          Du hast eine Kalenderwoche und ein Jahr?
          Und dur brauchst die "gültigen" Datumsangaben?
          Also im Prinzip sieben gültige Lösungen und das ganze ohne Schleife?
          TomIRL

          Ich habe lediglich die Variablen $jahr und $kw und $wtag.
          Also: Ich möchte einen Kalender erstellen der sich auf Kalenderwochen bezieht, sprich:

          a) Horizontale Aufteilung nach KW.
          b) Vertikalen Aufteilung nach Wochentag.

          Um das in einer Tabelle zu realisieren ohne große Umwege zu gehen, möchte ich gerne wie folgt vorgehen.

          Ich habe eine $kw (Spaltenname) und einen $wday (Zeilenkennung) und ein zugehöriges $jahr (aktuelles $jahr). Dann möchte ich einfach für alle Felder diese Funktion aufrufen und mir dazu dann den Timestamp zu dem Tag ausgeben lassen, um diesen dann in meiner Event-DB zu verwenden um Events zu den Tagen zu finden.

          Da ich aber 4 Wochen auf einmal anzeige, wird diese Funktion 28 mal aufgerufen. Wenn ich nun hergehe und ne Schleife reinschreibe, dann dauert das wohl ewig. Das möchte ich aber nicht, deswegen suche ich nach einer anderen Lösung, von der ich hoffe, dass es sie schon einmal auf dieser verkorksten Welt gibt ;o)

          Gruss Stefan

          1. Hello,

            Ich habe lediglich die Variablen $jahr und $kw und $wtag.
            Also: Ich möchte einen Kalender erstellen der sich auf Kalenderwochen bezieht, sprich:

            Schönes Design. Kann ich das Template von Dir haben, dann mach ich mir Gedanken über die "Rückwärtsdatum-Funktion"

            Wahrscheinlich wird es auf ein Array hinauslaufen, dass man für das Jahr berechnen muss und dann rückwärts ausliest, es sei denn, die Funktion strtotime() kann dafür genutzt werden.

            http://de.php.net/manual/de/function.strtotime.php

            Liebe Grüße aus http://www.braunschweig.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            1. Schönes Design. Kann ich das Template von Dir haben, dann mach ich mir Gedanken über die "Rückwärtsdatum-Funktion"

              Das Design ist bisher nur im Fireworks realisiert. Ich kann dir gerne eine Fireworks Datei zur Verfügung stellen, aber das hilft dir denke ich nicht viel.

              Wenn ich die Templates und alles fertig habe kann ich es dir gerne zusenden. Dazu musst du mir aber mal eine Email schreiben und mich daran erinnnern ;o) << vergesslich *g*

              Gruss zu Weihnachten
              Stefan

              1. Hello,

                Wenn ich die Templates und alles fertig habe kann ich es dir gerne zusenden. Dazu musst du mir aber mal eine Email schreiben und mich daran erinnnern ;o) << vergesslich *g*

                Habe ich gemacht. Mit einer erheblich kürzeren Funktion. Ich denke, da die PHP-Funktionen selber ja wunderbar compiliert sind, wird selbst das Stringparsen noch schneller gehen, als jede in Scriptsprache selbstgeschriebene Schleife. Das wäre aber noch zu untersuchen.

                Lösung siehe ganz oben im Thread.

                Liebe Grüße aus http://www.braunschweig.de

                Tom

                --
                Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
  2. So ich hab jetzt doch mal eine Funktion zusammengeschrieben.
    Es geht nicht ganz so schlimm mit einer Schleife um, wie das normal der Fall ist, sprich: Erst wird ein Mittelwert gesucht der grob durch Teilen ermittelt wird und dann wird von diesem Wert aus weitergesucht. Das beschleunigt die Sache doch um einiges.

    Wenn jemd. ein besseres Script hat begrüße ich dies nur zu gerne.

    Hier mein Code:

    function mktimefromkw($kw, $wtag, $jahr="", $stunde="", $minute="", $sekunde="") {
     if($wtag > 6) { $wtag -= 7; }                  // Wochentag konvertieren
       if(empty($jahr)) { $jahr = date("Y"); }        // Leeres Jahr füllen
       if(empty($stunde)) { $stunde = date("H"); }    // Leere Stunde füllen
       if(empty($minute)) { $minute = date("i"); }    // Leere Minute füllen
       if(empty($sekunde)) { $sekunde = date("s"); }  // Leere Sekunde füllen

    // Startwerte festlegen (Näherungswerte)
       $tagx = 1;
       $monatx = ceil($kw / 4);
       $jahrx = $jahr;

    while(true) {
          // Zeitwerte bestimmen
        $timex = mktime($stunde, $minute, $sekunde, $monatx, $tagx, $jahrx);
          $kwx = date("W", $timex);
          $wtagx = date("w", $timex);

    // Kontroll-Abfragen
        if($kw == $kwx) {
           if($wtag == $wtagx) {
              return $timex;
                break;
             } elseif($wtag > $wtagx) {
              $wtag--;
             } elseif($wtag < $wtagx) {
              $wtag++;
             }
          } elseif($kw > $kwx) {
           $tagx -= 7;
             if($tagx <= 0) {
                $tagx += 30;
              $monatx--;
                if($monatx <= 0) {
                 $monatx += 12;
                 $jahrx--;
                }
             }
          } elseif($kw < $kwx) {
           $tagx += 7;
             if($tagx <= 0) {
                $tagx -= 30;
              $monatx++;
                if($monatx <= 0) {
                 $monatx -= 12;
                 $jahrx++;
                }
             }
          }
       }
    }

    Gruss Stefan

  3. Moin!

    Soweit ich weiss, kannst Du creativerweise mktime() auch "lustige" Dinge wie den 366.01.2000 übergeben. (Ja das ist der 31.12.2000).
    Der Rest wir Dir schnell einfallen, wenn Du weisst, das die Woche sieben Tage hat, und wann die erste Woche Deines Kalenders beginnt.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix®

    --
    Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.
  4. Hello,

    ich habe Dir 'was gebastelt:

    <?php  #### kalenderwochen.php ####

    function get_date($year, $woy=1, $dow=1)
    {
      # $year = Jahreszahl vierstellig
      # $woy  = Woche des Jahres 1..52
      # $dow  = Tag der Woche    1..7

    $dow = ($dow)%7 -1;
      $woy = ($woy)%52 -1;
      $yearofs = ($year - 2003);
      $woy = $woy+($yearofs*52-52);

    $timestr = "29 December 2003 +$woy week +$dow day";

    #  echo "<br />".$timestr."<br />";  ## only for debug

    $time = strtotime($timestr);

    return $time;
    }
    #------------------------------------------------------------------

    #Mittwoch, 26.01.2004:
    $year = 2004;
    $woy  = 4;
    $dow  = 3;

    echo "Datum = ".date("d-m-Y", get_date($year, $woy, $dow))."<br />";

    #Freitag, 19.12.2003:
    $year = 2003;
    $woy  = 51;
    $dow  = 5;

    echo "Datum = ".date("d-m-Y", get_date($year, $woy, $dow))."<br />";

    ?>

    Soweit ich es ausprobiert habe, funktioniert es. Ich habe nun noch keine Fehlerkorrektur bei Fehlen von Parametern und auch keine Performance-Bestimmung für das Jahr 2040 gemacht *g*

    Kannt Du ja mal nachholen

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen