Ankündigung

Einklappen
Keine Ankündigung bisher.

Internationale Wochenttage von Nummer [erledigt]

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

  • Internationale Wochenttage von Nummer [erledigt]

    Hallo zusammen

    Ich versuche eine Methode zu schreiben, welche mir von den Wochentagen 0-7, jeweils den internationalen Wochentag als String zurück gibt.

    Jedoch scheitert es mir an einer schlauen Lösung. Vielleicht hat mir jemand einen kleinen Tip? Besten Dank im voraus.


    Das gleiche habe ich für die Monate gemacht und kam auf folgende Lösung:

    PHP-Code:
    /**
     * Convert month number to its name internationally.
     *
     * @param string|int The month number such as '01', 1, ...
     * @param string The pattern. 'M' = '1', 'MM' = '09', 'MMM' = 'Jan', 'MMMM' = 'January'
     * @param null|string The locale such as de_DE or null to use default set.
     * @return null|string The name such as 'January', or null if not valid.
     */
    public function toMonth($numberstring $pattern 'MMMM', ?string $locale null): ?string
    {
        if (!
    is_numeric($number))
        {
            return 
    null;
        }

        
    $number = (int) $number;

        if (
    $number 12 || $number 1)
        {
            return 
    null;
        }

        
    $number '2000-'.$number;

        
    $locale $locale ?: $this->getLocale();

        if (!
    in_array($pattern, ['M''MM''MMM''MMMM']))
        {
            
    $pattern 'MMMM';
        }

        
    $fmt = new IntlDateFormatter(
            
    $locale,
            
    IntlDateFormatter::FULL,
            
    IntlDateFormatter::NONE,
            
    $this->getDateTimeZone()->getName(),
            
    IntlDateFormatter::GREGORIAN,
            
    $pattern
        
    );

        try {
            
    $month $fmt->format($this->toDateTime($number));
            return 
    $pattern === 'MMM' rtrim($month'.') : $month;
        }
        catch (
    Throwable $t)
        {
            return 
    null;
        }



  • #2
    Da du ja schon IntlDateFormatter verfügbar hast dies als Ansatz:

    PHP-Code:
    $weekDayNumber 0//Sonntag

    $fmt datefmt_create"de-DE" ,IntlDateFormatter::FULLIntlDateFormatter::FULL,
         
    'Europe/Berlin',IntlDateFormatter::GREGORIAN  ,"EEEE");
    $dt date_create("4.1.1970 +".$weekDayNumber." Days");
    $weekDayName datefmt_format$fmt ,$dt); 
    LG jspit
    PHP-Klassen auf github

    Kommentar


    • #3
      Hallo jspit, danke Dir für den Ansatz. Dieser war sehr hilfreich, vorallem:

      Code:
      "4.1.1970 +".$weekDayNumber." Days"
      kannte ich nicht.


      Somit sieht nun die MEthode folgendermassen aus:
      PHP-Code:
      /**
       * Convert weekday number to its name internationally.
       *
       * @param int Day of week (0 - 7) (Sunday=0 or 7)
       * @param string The pattern. E, EE, or EEE = 'Tue', 'EEEE' = 'Tuesday', 'EEEEE' = 'T', 'EEEEEE' = 'Tu'
       * @param null|string The locale such as de_DE or null to use default set.
       * @return null|string The name such as 'January', or null if not valid.
       */
      public function toWeekday($numberstring $pattern 'EEEE', ?string $locale null): ?string
      {
          if (!
      is_int($number))
          {
              return 
      null;
          }

          if (
      $number || $number 0)
          {
              return 
      null;
          }

          
      $number '4.1.1970 +'.$number.' Days';

          
      $locale $locale ?: $this->getLocale();

          if (!
      in_array($pattern, ['E''EE''EEE''EEEE''EEEEE']))
          {
              
      $pattern 'EEEE';
          }

          
      $fmt = new IntlDateFormatter(
              
      $locale,
              
      IntlDateFormatter::FULL,
              
      IntlDateFormatter::NONE,
              
      $this->getDateTimeZone()->getName(),
              
      IntlDateFormatter::GREGORIAN,
              
      $pattern
          
      );

          try {
              
      $weekday $fmt->format($this->toDateTime($number));
              return 
      rtrim($weekday'.');
          }
          catch (
      Throwable $t)
          {
              return 
      null;
          }

      Kommentar


      • #4
        Hi,
        nimm mal besser immer diese Schreibweise für DateTime:
        PHP-Code:
        $dt date_create("1970-01-04 +".$weekDayNumber." Days"); 
        Die deutsche Datumsschreibweise wird teilweise von DateTime falsch interpretiert. Ich bin da etwas schlampig, da ich selbst immer eine Erweiterungsklasse nutze die alle möglichen deutschen Formate erkennt.
        PHP-Klassen auf github

        Kommentar


        • #5
          Ok danke dir für den nützlichen Hinweis.

          Kommentar


          • #6
            OT:
            IntlDateFormatter ist schon eine tolle Klasse. Leider ist die Klasse nicht immer verfügbar und die Handhabung nicht so ganz einfach. Für die Internationalisierung der Datumsausgabe (Tag- und Monatsnamen) der Klasse dt können Arrays für diverse Sprachen geladen werden. Angeregt durch diesen Thread habe ich als Alternative eine Variante mit dem IntlDateFormatter implementiert. Wenn die Klasse IntlDateFormatter verfügbar ist werden diverse Aktionen zum Laden der Sprachen überflüssig. Die Methode formatL arbeitet betreff der Formatangaben genau wie die PHP Funktion date mit einen weiteren optionalen Parameter für die Sprache. Die Handhabung wird so sehr einfach:
            PHP-Code:
            $date = new dt('2015-01-17');
            echo 
            $date->formatL('l, d.F Y');  //Ausgabe mit Default-Sprache 
            Ausgabe:
            Samstag, 17.Januar 2015

            Beispiele für div. Sprachen.
            PHP-Code:
            $locales = ['en','de','de_AT','fr','nl','es','ru','cs'];
            foreach(
            $locales as $loc){
              
            $strDate $date->formatL('l, d.F Y',$loc);
              echo 
            $loc.": ".$strDate."<br>";

            Ausgabe:
            en: Saturday, 17.January 2015
            de: Samstag, 17.Januar 2015
            de_AT: Samstag, 17.Jänner 2015
            fr: samedi, 17.janvier 2015
            nl: zaterdag, 17.januari 2015
            es: sábado, 17.enero 2015
            ru: суббота, 17.января 2015
            cs: sobota, 17.ledna 2015

            hausl : Stark ist auch de_AT
            PHP-Klassen auf github

            Kommentar


            • #7
              Wann ist die Klasse denn nicht vorhanden?
              http://php.net/manual/en/intl.requirements.php
              This extension is bundled with PHP as of PHP version 5.3.0.
              Und ältere Versionen sollten wohl nicht mehr im Umlauf sein.

              Dennoch schöne Umsetzung von Dir.

              Kommentar


              • #8
                Allerdings ist "17.January 2015" kein englisches Datumsformat.

                Beispiel:
                PHP-Code:
                $date = new DateTime('2015-01-17');

                $languages = ['de_DE''de_AT''en_GB''en_US''fr_FR''it_IT''es_ES''ja_JP'];

                foreach (
                $languages as $language) {
                    
                $formatter = new IntlDateFormatter($languageIntlDateFormatter::FULLIntlDateFormatter::NONE);
                    echo 
                $language ': ' $formatter->format($date) . PHP_EOL;

                Code:
                de_DE: Samstag, 17. Januar 2015
                de_AT: Samstag, 17. Jänner 2015
                en_GB: Saturday, 17 January 2015
                en_US: Saturday, January 17, 2015
                fr_FR: samedi 17 janvier 2015
                it_IT: sabato 17 gennaio 2015
                es_ES: sábado, 17 de enero de 2015
                ja_JP: 2015年1月17日土曜日

                Kommentar


                • #9
                  Zitat von hellbringer Beitrag anzeigen
                  PHP-Code:
                  $date = new DateTime('2015-01-17');

                  $languages = ['de_DE''de_AT''en_GB''en_US''fr_FR''it_IT''es_ES''ja_JP'];

                  foreach (
                  $languages as $language) {
                  $formatter = new IntlDateFormatter($languageIntlDateFormatter::FULLIntlDateFormatter::NONE);
                  echo 
                  $language ': ' $formatter->format($date) . PHP_EOL;

                  Code:
                  de_DE: Samstag, 17. Januar 2015
                  de_AT: Samstag, 17. Jänner 2015
                  en_GB: Saturday, 17 January 2015
                  en_US: Saturday, January 17, 2015
                  fr_FR: samedi 17 janvier 2015
                  it_IT: sabato 17 gennaio 2015
                  es_ES: sábado, 17 de enero de 2015
                  ja_JP: 2015年1月17日土曜日
                  Das wäre ein schönes Beispiel für die (noch nicht vorhandene) Erwähnung des IntlDateFormatter in der Wissenssammlung.
                  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