Ankündigung

Einklappen
Keine Ankündigung bisher.

Kalendermonat und Kalendertag bestimmten

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

  • Kalendermonat und Kalendertag bestimmten

    Guten Tag,
    ich habe eine Frage:
    Und zwar habe ich in einem Array als Index einen Tag im Jahr. Also im Bereich von (1-365). Ich würde gerne nur durch den Tag sein Kalendertag ermitteln, sprich ob Montag, Dienstag etc. und in welchem Monat dieser Tag ist.

    Wie kann ich das realisieren?

    Beispiel:

    $jahr[5] ist gegeben und dann soll ermittelt werden welcher Kalendertag und Kalendermonat, sprich in dem Fall Montag und Januar. Dabei soll das aktuelle Jahr verwendet werden für die Berechnung.

    Ich hoffe Sie können mir helfen das zu realisieren.

    MfG
    ChrisB.


  • #2
    PHP-Code:
    $i 14;

    $dt DateTime::createFromFormat('z'$i 1);
    echo 
    $dt->format('l F (Y-m-d)') . "\n";
        
    // Wednesday January (2015-01-14) 
    PHP-Wissenssammlung Composer Awesome Awesomeness PHP: The Right Way @mermshaus

    Kommentar


    • #3
      Erstelle ein DateTime-Objekt.
      Zum Erstellen so:
      DateTime::createFromFormat mit dem format character "z" (siehe Tabelle).

      Beim Auslesen dann einfach DateTime::format mit den gewünschten format characters verwenden. Je nachdem ob du deutsche oder englische Bezeichnungen willst, numerisch oder ausgeschrieben, musst du dir eben das richtige aus der Tabelle suchen.

      Kommentar


      • #4
        Du brauchst für die Ermittlung des Wochentages immer die folgenden Angaben.

        Jahr
        Monat
        Tag im Monat

        denn von diesen Faktoren hängt es nuneinmal ab. Der 14. Januar ist ja nicht jedes Jahr ein Mittwoch

        Du kannst mit mktime aus den Daten einen Timestamp erstellen und diesen dann mit date() formatieren.

        Das Beispiel für heute würde dann z.B. so aussehen
        PHP-Code:
        $day date("l"mktime(0001142015)); 
        Die Variable $day enthält dann als Resultat "wednesday".

        Kommentar


        • #5
          Zitat von TessaKavanagh Beitrag anzeigen
          denn von diesen Faktoren hängt es nuneinmal ab. Der 14. Januar ist ja nicht jedes Jahr ein Mittwoch
          Die DateTime-Variante mit variabler Jahresangabe:

          PHP-Code:
          $i 14;
          $y 2016;

          $dt DateTime::createFromFormat('z Y'sprintf('%s %s'$i 1$y));
          echo 
          $dt->format('l F (Y-m-d)') . "\n";
              
          // Thursday January (2016-01-14) 
          PHP-Wissenssammlung Composer Awesome Awesomeness PHP: The Right Way @mermshaus

          Kommentar


          • #6
            Die DateTime-Variante 2 mit variabler Jahresangabe:
            PHP-Code:
            $i 14
            $y 2016

            $dt date_create($y.'-1-1 +'.($i-1).' Days'); 
            PHP-Klassen auf github

            Kommentar


            • #7
              Ok nachdem ich mir das oben jetzt noch einmal durchgelesen habe komme ich zu dem Ergebnis das der TE aus der Tagesanzahl Monat und Wochentag ermitteln möchte und zwar immer im aktuellen Jahr.

              Dann würde ich ganz spontan so an die Sache rangehen.
              PHP-Code:
              //Prüfwert
              $day 183;
              $day_tmp $day;
              $year date("Y"time());

              // Wochentag Berechnen
              for($a 1$a <= 12$a++)
              {
                     if(
              $day_tmp date("t"mktime(000$a1$year)) > 0)
                     {
              $day_tmp $day_tmp date("t"mktime(000$a1$year));}
                     else{echo 
              htmlentities("Day ".$day." in ".$year." is a "date("l"mktime(000$a$day_tmp$year)). " in "date("F"mktime(000$a1$year)).".");
                     
              $a 13;}

              Der Code ist ungetestet sollte aber dem Grunde nach funktionieren.

              Kommentar


              • #8
                ... und hier noch die Varianten für die restlichen beiden Datums-APIs in PHP:

                PHP-Code:
                $doty 123// day of the year
                $year date('Y'); // aktuelles Jahr


                // IntlCalendar::
                $icldr IntlCalendar::createInstance();
                $icldr->set(IntlCalendar::FIELD_YEAR, (int) $year);
                $icldr->set(IntlCalendar::FIELD_DAY_OF_YEAR, (int) $doty);

                var_dump(IntlDateFormatter::formatObject($icldr'yyyy-MM-dd')); // fulldate
                var_dump(IntlDateFormatter::formatObject($icldr'eeee (e)')); // day of the week
                var_dump(IntlDateFormatter::formatObject($icldr'MMMM')); // month

                // string(10) "2015-05-03"
                // string(11) "Sonntag (7)"
                // string(3) "Mai" 
                PHP-Code:
                // book.calendar.php
                $sdn cal_to_jd(CAL_GREGORIAN11, (int) $year);
                $extcal = (object) cal_from_jd($sdn $dotyCAL_GREGORIAN);

                var_dump(sprintf('%04d-%02d-%02d'$extcal->year$extcal->month$extcal->day)); // fulldate
                var_dump($extcal->dayname); // day of the week
                var_dump($extcal->month); // month

                // string(10) "2015-05-03"
                // string(6) "Sunday"
                // int(5) 
                Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

                Kommentar


                • #9
                  Zitat von TessaKavanagh Beitrag anzeigen
                  Dann würde ich ganz spontan so an die Sache rangehen. […]
                  Ich würde da ja mal ganz spontan mit einem DateTime-Objekt rangehen wie es mermshaus schon vor einer Stunde gepostet hat - dein Code ist doch irgendwo *richtig* umständlich. Außerdem: nicht htmlentities() verwenden, die Funktion ersetzt zu viel, verwende htmlspecialchars().

                  Kommentar


                  • #10
                    Ich würde gerne nur durch den Tag sein Kalendertag ermitteln, sprich ob Montag, Dienstag etc. und in welchem Monat dieser Tag ist.
                    Wurde es auch so in der Art machen, aber gleich auf deutsch - hier auf Basis von mermshaus Beispiele:

                    PHP-Code:
                    $i 14;

                    $aWeekdayNamesDE = ['Montag''Dienstag''Mittwoch''Donnerstag''Freitag''Samstag''Sonntag'];
                    $aMonthNamesDE   = ['Jänner''Februar''März''April''Mai''Juni''Juli''August''September''Oktober''November''Dezember'];
                    $dt DateTime::createFromFormat('z'$i 1);

                    echo 
                    $aWeekdayNamesDE[$dt->format('w') - 1]."\n";
                    echo 
                    $aMonthNamesDE[$dt->format('n') - 1]."\n";
                    echo 
                    $dt->format('(Y-m-d)')."\n";

                    /*
                    Mittwoch
                    Jänner
                    (2015-01-14)
                    */ 
                    und mit Angabe des Jahres:

                    PHP-Code:
                    $i 14
                    $y 2016

                    $aWeekdayNamesDE = ['Montag''Dienstag''Mittwoch''Donnerstag''Freitag''Samstag''Sonntag'];
                    $aMonthNamesDE   = ['Jänner''Februar''März''April''Mai''Juni''Juli''August''September''Oktober''November''Dezember'];
                    $dt DateTime::createFromFormat('z Y'sprintf('%s %s'$i 1$y));

                    echo 
                    $aWeekdayNamesDE[$dt->format('w') - 1]."\n";
                    echo 
                    $aMonthNamesDE[$dt->format('n') - 1]."\n";
                    echo 
                    $dt->format('(Y-m-d)')."\n";

                    /*
                    Donnerstag
                    Jänner
                    (2016-01-14)
                    */ 
                    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


                    • #11
                      Zitat von hausl Beitrag anzeigen
                      Wurde es (auch) so in der Art machen, aber gleich auf deutsch:
                      Naja, es gibt wohl verschiedene Arten von Deutsch ...

                      Das folgende führt zum gleichen Ergebnis (auch mit DateTime-Objekten), kommt aber ohne die extra Arrays aus:
                      PHP-Code:
                      $locale 'de_AT';
                      echo 
                      IntlDateFormatter::formatObject($dt'eeee'$locale) ."\n";
                      echo 
                      IntlDateFormatter::formatObject($dt'MMMM'$locale) ."\n";
                      echo 
                      IntlDateFormatter::formatObject($dt'(yyyy-MM-dd)'$locale) ."\n"
                      Das Umstellen von $locale auf das andere Deutsch "de_DE" lässt dann auch den Jänner als Januar erscheinen. Interessant sind auch "ksh_DE", "gsw_CH", "wae_CH", "lb_LU" ...

                      Code:
                      de_AT: Samstag Jänner (2015-01-31) 
                      de_DE: Samstag Januar (2015-01-31) 
                      ksh_DE: Samsdaach Jannewa (2015-01-31) 
                      gsw_CH: Samschtig Januar (2015-01-31) 
                      wae_CH: Samštag Jenner (2015-01-31) 
                      lb_LU: Samschdeg Januar (2015-01-31)
                      Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

                      Kommentar


                      • #12
                        Zitat von fireweasel Beitrag anzeigen
                        Naja, es gibt wohl verschiedene Arten von Deutsch ...
                        Code:
                        de_AT: Samstag Jänner (2015-01-31) 
                        de_DE: Samstag Januar (2015-01-31)
                        ...
                        Ich meinte natürlich das echte Deutsch, genau das was ich hier in Österreich sprechen und schreiben gelernt habe.

                        Scherz beiseite, ich hatte mit den "Lokalisierungen" von Datumsausgaben früher, wenn ich es brauchte, immer wieder mal Probleme (war aber die setlocale() Geschichte), daher diese Gangart. Ist aber schon länger aus und da PHP ist nur eins (von vielen) Hobbys ist, bin ich da definitiv auch kein Maßstab, wahrscheinlich hab ich es einfach nur falsch gemacht, oder es lag am Billig-Hoster . Danke jedenfalls für das Beispiel!

                        LG
                        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


                        • #13
                          Zitat von hausl Beitrag anzeigen
                          Scherz beiseite, ich hatte mit den "Lokalisierungen" von Datumsausgaben früher, wenn ich es brauchte, immer wieder mal Probleme (war aber die setlocale() Geschichte), daher diese Gangart.
                          Deswegen hab ich die ICU-/Intl-Lokalisierung benutzt. Da muss man zwar wieder neue lustige Format-Codes lernen, aber wenigstens funktioniert die Lokalisierung systemübergreifend gleich.
                          Ist aber schon länger aus und da PHP ... nur eins (von vielen) Hobbys ist, bin ich da definitiv auch kein Maßstab, wahrscheinlich hab ich es einfach nur falsch gemacht, oder es lag am Billig-Hoster
                          Das ist der Knackpunkt. Das lief so auf meiner Windows-Kiste. Was irgendein Hoster so als ICU-Locales installiert, muss man vorher wohl testen, wenn man nicht alles in "en_US" haben will.

                          Danke jedenfalls für das Beispiel!
                          Gleichfalls. Dein Jänner hat mich erst auf die Idee gebracht, das mal mit IntlDateFormatter zu versuchen.
                          Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

                          Kommentar


                          • #14
                            @ #10 Da war übrigens noch ein Fehler bei den Wochentagen:

                            PHP-Code:
                            $aWeekdayNamesDE = ['Montag''Dienstag''Mittwoch''Donnerstag''Freitag''Samstag''Sonntag']; 
                            So besser:

                            PHP-Code:
                            $aWeekdayNamesDE = ['Sonntag''Montag''Dienstag''Mittwoch''Donnerstag''Freitag''Samstag']; 
                            LG
                            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

                            Lädt...
                            X