web-dev-qa-db-fra.com

Récupération des noms de jour dans PHP

J'ai besoin d'afficher à l'utilisateur une liste de noms de jours localisés (comme "lundi", "mardi", ...) dans un formulaire. Je sais comment obtenir le nom du jour de n'importe quelle date. Mais existe-t-il un moyen particulier et infaillible d’obtenir les noms de tous les jours dans un tableau? 

Edit: Je pourrais ajouter des noms de jours à mon fichier de traduction mais cela est difficile à maintenir.

10
Cemal Eker

L'utilisation de strftime() en combinaison avec setlocale() est une option.

Cependant, vous devez savoir que sur les installations php threadées, setlocale() peut se comporter de manière inattendue, car les informations sur les paramètres régionaux sont conservées par processus, et non par thread. Par conséquent, il est important d’appeler setlocale() à chaque fois avant chaque appel vers strftime() afin de vous assurer qu’il utilise les paramètres régionaux appropriés.

De plus, pour les systèmes Windows, vous devez utiliser des chaînes quelque peu inhabituelles pour le paramètre $locale pour setlocale().

Consultez la documentation pour plus d'informations sur ces deux problèmes.

Quelque chose comme ça devrait marcher:

// define the locales for setlocale() for which we need the daynames
$locales = array(
  'en_EN',
  'de_DE',
  'nl_NL'
  // etc...
);

// be aware that setlocale() needs different values on Windows machines
// see the docs on setlocale() for more information
$locales = array(
  'english',
  'german',
  'dutch'
  // etc...
);

// let's remember the current local setting
$oldLocale = setlocale( LC_TIME, '0' );

// initialize out result array
$localizedWeekdays = array();

// loop each locale
foreach( $locales as $locale )
{
    // create sub result array for this locale 
    $localizedWeekdays[ $locale ] = array();

    // 7 days in a week
    for( $i = 0; $i < 7; $i++ )
    {
        // set the locale on each iteration again
        setlocale( LC_TIME, $locale );

        // combine strftime() with the nifty strtotime()
        $localizedWeekdays[ $locale ][] = strftime( '%A', strtotime( 'next Monday +' . $i . ' days' ) );

        // reset the locale for other threads, as a courtesy
        setlocale( LC_TIME, $oldLocale );
    }
}

// there is your result in a multi-dimensional array
var_dump( $localizedWeekdays );
13
Decent Dabbler
$date = '2011/10/14'; 
$day = date('l', strtotime($date));
echo $day;
33
Abbas
$dayNames = array(
    'Sunday',
    'Monday', 
    'Tuesday', 
    'Wednesday', 
    'Thursday', 
    'Friday', 
    'Saturday', 
 );

Est-ce assez à l'abri :)

Sur une note plus sérieuse, les goûts de PHPBB le font en définissant des fichiers de localisation et un codage en dur pour différentes langues. C'est vraiment le seul moyen de le faire de manière fiable.

Je recommanderais de télécharger quelque chose comme ça et de regarder le code pour voir comment c'est fait.

http://www.phpbb.com/downloads/Olympus.php

2
vascowhite

La méthode "habituelle" consiste à commencer par un last day donné et à compter un jour à chaque itération.

for ($i = 0; $i < 7; $i++) {
  $weekDayNames[] = strftime("%a", strtotime("last sunday +$i day"));
}
2
yckart
setlocale(LC_TIME, 'de_DE');

$today = ( 86400 * (date("N")) );

for( $i = 0; $i < 7; $i++ ) {
    $days[] = strftime('%A', time() - $today + ($i*86400));
}

print_r($days);

Évidemment, on peut optimiser en n'appelant pas time () 7 fois, etc., mais c'est le Gist. Il vous donne la bonne langue pour les paramètres régionaux et maintient en ordre l’ordre Sun-Sat du tableau.

0
Ben Swinburne

Je sais que ça fait longtemps, mais qu'en est-il:

$timestamp = strtotime('next Sunday');
$days = array();
for ($i = 0; $i < 7; $i++) {
 $days[] = strftime('%A', $timestamp);
 $timestamp = strtotime('+1 day', $timestamp);
}

from comment créer un tableau avec un nom de semaine en php

0
d0001