noknok: Wochen eines Jahres

Wie kann ich elegant bzw. überhaupt die Anzahl der Wochen eines Jahres ermitteln?

Mit anderen Worten, ich will mir eine Funktion
  numberOfWeeks($year)
implementieren, so dass z.b.
  numberOfWeeks(2010)==52
und
  numberOfWeeks(2009)==53.

Mittels
  $w = date ( "W", mktime(0,0,0,$month,$day,$year) );
kann ich die korrekte (normierte) Wochen-Nummer eines angegebenen Tages ermitteln. Aber
  $numOfWeeks = date ("W",mktime(0,0,0,12,31,$year));
löst mein Problem nicht, denn das gibt entweder "52", manchmal "53", aber oft auch "01" zurück.

Wer weiss eine elegante und korrekte Lösung?

  1. Oeps, hab schon selber eine Lösung gefunden, glaube ich, auf http://de.wikipedia.org/wiki/Woche

    Das Jahr hat 53 wochen gdw der erste oder letzte Tag des Jahres ein Donnerstag ist. Wer hätte das gedacht.

  2. Hi.

    Wer weiss eine elegante und korrekte Lösung?

    Ich weiß eine elegante und eine korrekte Lösung. Die sind aber leider verschieden :-)

    Nein, Spaß. Kaum überraschenderweise ist das kein PHP-Problem, sondern ein "Verstehe-die-Definition-der-Wochen-nach-Iso-dann-ist-die-Lösung-ein-Einzeiler"-Problem.

    ISO 8601 sagt, dass die letzte Woche des Jahres immer diejenige ist, die den 28. Dezember enthält. Das dürfte reichen, oder?

    Du hast die Definition nicht mal nachgeguckt, richtig? Na ja, ist ja auch schon spät.

    Viele Grüße,
    der Bademeister

    1. Hallo Bademeister,

      Vielen Dank für Deine Antwort.

      Nein, Spaß. Kaum überraschenderweise ist das kein PHP-Problem, sondern ein "Verstehe-die-Definition-der-Wochen-nach-Iso-dann-ist-die-Lösung-ein-Einzeiler"-Problem.

      So ganz verstehe ich nicht, warum Du das sagst. Die ganze Erweiterung
        http://nl.php.net/manual/en/book.datetime.php
      ist ja eigentlich auch nur ein "Ersatz" für die Anwendung der Regeln.

      ISO 8601 sagt, dass die letzte Woche des Jahres immer diejenige ist, die den 28. Dezember enthält. Das dürfte reichen, oder?

      Ja, stimmt, die Definition ist noch einfacher zu implementieren als diejenige, die ich inzwischen gefunden habe.

      Vielen Dank, nochmals!

  3. Wie kann ich elegant bzw. überhaupt die Anzahl der Wochen eines Jahres ermitteln?

    Mit anderen Worten, ich will mir eine Funktion
      numberOfWeeks($year)
    implementieren, so dass z.b.
      numberOfWeeks(2010)==52
    und
      numberOfWeeks(2009)==53.

    Das ist aber jetzt vielleicht interessant zu wissen, denn da gibt es vermutlich einen Bug in PHP?

    Zuerst hatte ich mir schon implementiert:

    function numberOfWeeks($year) {
      $firstDay = date ( "N", mktime(0,0,0,1,1,$year) );
      $lastDay = date ( "N", mktime(0,0,0,12,31,$year) );
      if ( $firstDay == 4 || $lastDay == 4 )
        return 53;
      else
        return 52;
    }

    Nach dem Tip vom Bademeister habe ich mir das verkuerzt zu

    function numberOfWeeks($year) {
      return date ("W", mktime(0,0,0,12,28,$year));
    }

    Die erste Version scheint korrekt zu arbeiten, aber in der zweiten Version gibt es fuer $year > 2038 immer nur das Ergebnis '01' anstatt '52' oder '53'.

    Dies passier jedenfalls in meinem PHP 5.2.6-2ubuntu4.6 und PHP 5.3.2 (cli).

    1. Hi,

      Die erste Version scheint korrekt zu arbeiten, aber in der zweiten Version gibt es fuer $year > 2038 immer nur das Ergebnis '01' anstatt '52' oder '53'.

      2038 passiert der Überlauf bei 32-bit timestamps (Sekunden seit 1.1.1970), die werden dann negativ ...

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
      1. 2038 passiert der Überlauf bei 32-bit timestamps (Sekunden seit 1.1.1970), die werden dann negativ ...

        Hi Andreas, vielen Dank. Das erklärt natürlich alles!
        Aber wie ist das dann generell mit den timestamps in PHP und anderen Techniken (SQL etc), ist das dann nicht ein ganz grundsätzliches Problem, so wie das Y2K, nur dass man diesmal sicher weiss, dass da ein Fehler sitzt?
        Ich meine, wie geht man da mit Kalendersystemen um, die auch in 20 Jahren noch korrekt laufen sollen?

        1. Hi,

          Aber wie ist das dann generell mit den timestamps in PHP und anderen Techniken (SQL etc), ist das dann nicht ein ganz grundsätzliches Problem, so wie das Y2K, nur dass man diesmal sicher weiss, dass da ein Fehler sitzt?

          Das wusste man bei Y2K auch ...

          Ich meine, wie geht man da mit Kalendersystemen um, die auch in 20 Jahren noch korrekt laufen sollen?

          Man nutzt in PHP gleich DateTime, das speichert den Timestamp als 64 Bit-Wert, unabhängig vom System.

          Bzgl. MySQL liest man im Manual nach, wie es da mit dem Wertebereich der Datumstypen aussieht.

          MfG ChrisB

          --
          RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
          1. Man nutzt in PHP gleich DateTime, das speichert den Timestamp als 64 Bit-Wert, unabhängig vom System.

            Hi ChrisB und vielen Dank für Deine Antwort.
            Ich vermute, Dein Hinweis bedeutet, dass ich konsequent objekt-orientiert arbeiten sollte. Ich hätte nicht gedacht, dass es da in der Wirkung solche Unterschiede gibt. Ich muss mich wohl mal erneut in die docs vertiefen...
            Vielen Dank nochmal.

            1. Hi!

              Man nutzt in PHP gleich DateTime, das speichert den Timestamp als 64 Bit-Wert, unabhängig vom System.
              Ich vermute, Dein Hinweis bedeutet, dass ich konsequent objekt-orientiert arbeiten sollte.

              Sicher nicht. Man kann unter PHP nicht "konsequent objekt-orientiert arbeiten", weil ziemlich viele Funktion und die grundlegenden Datentypen nicht objektorientiert vorliegen. Zudem gibt es zu den Methoden von DateTime und Co. äquvalente Funktionen. Natürlich kannst du soweit wie möglich versuchen, oo zu programmieren, aber es bleibt letztlich deine Entscheidung ob du das machen willst oder nicht.

              Lo!

  4. Wie kann ich elegant bzw. überhaupt die Anzahl der Wochen eines Jahres ermitteln?

    Deep Thougt würde sagen: 42. Aber das ist falsch. Es sind immer 52 - glaub's mir. Da jibbet nix zu ermitteln, denn ein Jahr bleibt ein Jahr.

    1. @@Einstein:

      nuqneH

      Es sind immer 52 - glaub's mir.

      Das ist völler Unsinn. Das Verfolgen der im Thread bereits gegebenen Hinweise hätte dich vor diesem bewahrt.

      52 mal 7 sind immer 364 – glaub’s mir.

      Qapla'

      --
      Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
      (Mark Twain)
      1. Hi Gunnar.

        @@Einstein:

        [...]

        Das ist völler Unsinn.

        Wer mit Einstein über Zeitfragen diskutiert, begibt sich auf dünnes Eis.

        ;-)

        Viele Grüße,
        der Bademeister

        1. @@Bademeister:

          nuqneH

          Wer mit Einstein über Zeitfragen diskutiert, begibt sich auf dünnes Eis.

          *g*

          [latex]\sqrt{1-\frac{v^2}{c^2}}=\frac{364}{365}[/latex]
          ergibt ja bloß eine Geschwindigkeit von etwa 7.4% der der Lichts. Das sollte zu schaffen sein. Im Schaltjahr muss man sich allerdings sputen, da sind’s schon über 10%.

          Qapla'

          --
          Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
          (Mark Twain)