Ankündigung

Einklappen
Keine Ankündigung bisher.

Kalenderwoche ab Sonntag

Einklappen

Neue Werbung 2019

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

  • Kalenderwoche ab Sonntag

    Ich würde gerne die Kalenderwoche anders ausgeben.

    date('W') liefert ja das Format in der ISO-8601, sozusagen wird eine KW von Montag bis Sonntag gezählt.

    Ich würde jedoch gerne das die Woche von Sonntag bis Samstag gezählt wird.

    Für diese Woche wäre dann die KW vom 27.08. - 02.09. sozusagen die KW 35.

  • #2
    Versuche das mal.
    PHP-Code:
    $week intval(date('W'));  
    if (
    date('w') == 0) {            // 0 = Sunday    
        
    $week++;
    }  
    echo 
    $week

    Kommentar


    • #3
      PHP-Code:
      header('Content-Type: text/plain');

      $timeZone = new DateTimeZone('Europe/Berlin');

      $date = new DateTime('2017-08-20'$timeZone);
      $lastDay = new DateTime('2017-08-30'$timeZone);

      $formatterDE = new IntlDateFormatter('de-DE'IntlDateFormatter::FULLIntlDateFormatter::FULL);
      $formatterDE->setPattern('w');
      $formatterUS = new IntlDateFormatter('en-US'IntlDateFormatter::FULLIntlDateFormatter::FULL);
      $formatterUS->setPattern('w');

      while (
      $date <= $lastDay) {
          
      printf(
              
      '%s (DE: %u, US: %u)' PHP_EOL,
              
      $date->format('D, j M'),
              
      $formatterDE->format($date),
              
      $formatterUS->format($date)
          );
          
      $date->modify('+1 day');

      Ausgabe:
      Code:
      Sun, 20 Aug (DE: 33, US: 34)
      Mon, 21 Aug (DE: 34, US: 34)
      Tue, 22 Aug (DE: 34, US: 34)
      Wed, 23 Aug (DE: 34, US: 34)
      Thu, 24 Aug (DE: 34, US: 34)
      Fri, 25 Aug (DE: 34, US: 34)
      Sat, 26 Aug (DE: 34, US: 34)
      Sun, 27 Aug (DE: 34, US: 35)
      Mon, 28 Aug (DE: 35, US: 35)
      Tue, 29 Aug (DE: 35, US: 35)
      Wed, 30 Aug (DE: 35, US: 35)

      Kommentar


      • #4
        Fällt der 31.12.2017 in den USA nicht in die 53.Woche? Mit dem IntlDateFormatter wird da die Wochennummer 1 berechnet.
        Edit: Für den 2015-12-28 wird auch die Woche 1 ausgewiesen. Das dürfte m.E. falsch sein.
        Der Vorschlag #2 ist ebenfalls fehlerhaft (s.a. hier )

        Kommentar


        • #5
          Die Angaben beziehen sich auf die gewählte Zeitzone und Uhrzeit. Wenn in Sydney die Sonne aufgeht ist es bei uns noch der Tag zuvor..

          Probier mal folgende Angaben
          PHP-Code:
          $timeZone = new DateTimeZone('Australia/Sydney');

          $date = new DateTime('2017-12-31 06:00:00'$timeZone);
          $lastDay = new DateTime('2018-02-28'$timeZone);
          ... 

          Kommentar


          • #6
            Die ISO-8601 legt nun mal fest, das die Woche am Montag beginnt. Den Wochenbeginn auf Sonntag zu verschieben und mit der Wochenzählung weiter analog ISO-8601 zu verfahren ist Unsinn.
            Ich vermute daher, es wird eine Wochenzählung wie in den USA gebraucht ( s. dazu Wiki: Berechnung in den USA und vielen anderen Ländern ).
            hellbringer zeigt dafür einen guten Ansatz. Doch leider ist in der IntlDateFormatter-Klasse m.E. noch ein Bug und diese Klasse ist auch nicht immer verfügbar.

            Kommentar


            • #7
              Zitat von Alex73 Beitrag anzeigen
              Ich würde gerne die Kalenderwoche anders ausgeben.
              Der Grund ist doch mal nebensächlich, er will das so und dafür hat er 2 Ansätze erhalten wie man das umsetzen kann.
              Er ist sich ja auch dessen bewusst wie er schreibt, ich finde es daher nicht fair von Unsinn zu schreiben.

              Ob in der IntlDateFprmatter-Klasse ein Bug ist kann ich nicht beurteilen, da auch der Wikipediaartikel fehlerbehaftet sein kann, nach dem da jeder reinschreiben kann, ich habe das nicht näher hinterfragt.

              Nach diesem Link beginnt in den USA die erste Woche für 2018 auch bereits am 31.12.2017, die können ja nicht alle falsch liegen.

              Kommentar


              • #8
                Also die Class von jspit funktioniert wie immer hervorragend.
                Allerdings ist diese mal wieder ganz schön umfangreich um es ganz vorsichtig auszudrücken
                Ich habe mir also die Class von jspit-Links auf meiner Seite eingebunden und dabei ist folgendes herausgekommen:
                Test 16 527 $expected = 1;
                $result = week_of_year_usa('2017-12-31');
                [0.0 ms]
                53
                Error
                Ich wollte eigentlich dass als Ausgabe: "Kalenderwoche: 35" und zwar ab dem 27.08.2017 auf meiner Seite steht.

                Wie mache ich das jetzt?

                Kommentar


                • #9
                  PHP-Code:
                  $timeZone = new DateTimeZone('Europe/Berlin');

                  $date = new DateTime('2017-08-27'$timeZone);

                  $formatter = new IntlDateFormatter('en-US'IntlDateFormatter::FULLIntlDateFormatter::FULL);
                  $formatter->setPattern('w');

                  echo 
                  'Kalenderwoche: ' $formatter->format($date);
                  // Kalenderwoche: 35 

                  Kommentar


                  • #10
                    Also bei mir kommt ein Error raus. Liegt wahrscheinlich daran, dass ich die Class "IntlDateFormatter" nicht habe.

                    Ist das die von PHP.net?

                    Oder muss ich da noch etwas anderes vorher laden?

                    Kommentar


                    • #11
                      http://php.net/manual/en/intl.installation.php

                      Kommentar


                      • #12
                        Was steckt hinter deiner Frage #1 ? Möchtest du die Kalenderwochen so zählen wie in den USA? Hast du mal in die Beiträge vom phpforum geschaut? Dort wurde das schon mal diskutiert.

                        Edit: Noch ein interessanter Beitrag: On week numbering in the United States

                        Kommentar


                        • #13
                          Hallo,

                          vielen Dank noch einmal für die vielen Antworten.

                          Die Antwort von hellbringer hat dann geholfen
                          Das php5-intl hat dann zusammen mit dem Code geholfen. Das kannte ich bis jetzt noch gar nicht.

                          jspit Den Beitrag habe ich natürlich gelesen, allerdings stand da so viel und ich bin doch noch gar nicht so fit in PHP

                          Kommentar


                          • #14
                            hellbringer

                            Wenn ich deinen Code:
                            PHP-Code:
                            $timeZone = new DateTimeZone('Europe/Berlin');

                            $date = new DateTime('2017-08-27'$timeZone);

                            $formatter = new IntlDateFormatter('en-US'IntlDateFormatter::FULLIntlDateFormatter::FULL);
                            $formatter->setPattern('h:mm a');

                            echo 
                            'Kalenderwoche: ' $formatter->format($date); 
                            in meine Seite integriere, dann kommt da folgende Ausgabe:

                            Kalenderwoche: 9:30 PM

                            Was mir jetzt nicht daran gefällt ist die Tatsache, dass es jetzt 14:31 Uhr ist und nicht 9:30 PM. Rein rechnerisch wäre es jetzt 02:31 PM.

                            Nur um es vorweg zu sagen, das Datum stimmt, da ich aber mit verschiedenen Zeitzonen arbeite, benötige ich natürlich auch die genaue Uhrzeit, der jeweiligen Zeitzone.

                            Geht das mit der Uhrzeit noch ein wenig genauer oder geht das nur über diesen groben Schätzwert?

                            Kommentar


                            • #15
                              Das kann nicht sein. $date enthält die Uhrzeit 00:00, da ja nur ein Datum ein keine Uhrzeit angegeben wurde.

                              Also wenn ich den Code von dir 1:1 kopiere, bekomme ich als Ausgabe "12:00 AM", wie erwartet.

                              Kommentar

                              Lädt...
                              X