2011-10-14 3 views
10

Devo visualizzare all'utente un elenco di nomi di giorni localizzati (come "lunedì", "martedì", ...) in un modulo. So come ottenere il nome del giorno di qualsiasi data. Ma esiste un modo particolare e a prova di errore per ottenere tutti i nomi dei giorni in un array.Recupero dei nomi dei giorni in PHP

Modifica: potrei aggiungere nomi di giorni al mio file di traduzione, ma è difficile da mantenere.

+0

Nome giorno? Intendi come 'lunedì, martedì, mercoledì ... ecc?' – LouwHopley

+2

Perché non definirli da soli? Di solito è il modo migliore per andare, perché chiedere 'date()' dipende dalle impostazioni locali notoriamente inaffidabili. –

+2

* (riferimento) * http://www.php.net/manual/en/intldateformatter.format.php – Gordon

risposta

13

L'utilizzo di strftime() in combinazione con setlocale() è un'opzione.

Tuttavia, è necessario tenere presente che nelle installazioni con php filettati, setlocale() può comportarsi in modo imprevisto, poiché le informazioni sulla locale vengono gestite per processo, non per thread. Pertanto è importante chiamare lo setlocale() ogni volta prima di ogni chiamata a strftime() per garantire che utilizzi la locale corretta.

Inoltre, per i sistemi Windows, è necessario utilizzare stringhe un po 'insolite per il parametro $locale per setlocale().

Vedere i documenti per ulteriori informazioni su entrambi questi problemi.

Qualcosa del genere dovrebbe funzionare:

// 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); 
3
$dayNames = array(
    'Sunday', 
    'Monday', 
    'Tuesday', 
    'Wednesday', 
    'Thursday', 
    'Friday', 
    'Saturday', 
); 

è abbastanza :)

Su una nota più grave prova di fail-, del calibro di phpBB fare questo attraverso la definizione di file di localizzazione e codifica difficile per lingue diverse. È davvero l'unico modo per farlo in modo affidabile.

Vorrei raccomandare di scaricare qualcosa del genere e guardare il codice per vedere come è stato fatto.

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

+2

È difficile da mantenere per tutte le lingue e questo mi rende un panda triste. –

+1

-1 OP ha richiesto nomi localizzati. –

+3

Sono localizzati per me :) – vascowhite

32
$date = '2011/10/14'; 
$day = date('l', strtotime($date)); 
echo $day; 
+0

Grazie per la tua buona e semplice risposta +1 –

+0

Improvvisamente non funziona dopo aver lavorato e ho fermato l'apache! Ora viene restituito il numero anziché il nome del giorno ... – KeepMove

0
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); 

Ovviamente può essere ottimizzata non chiamare tempo() 7 volte, ecc, ma questo è il succo. Ti dà la lingua giusta per la localizzazione e mantiene intatto l'ordine Sun-Sat dell'array.

0

So che è passato molto tempo, ma per quanto riguarda:

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

da how to create array of a week days name in php

+0

Non vedo alcuna differenza tra questa soluzione e la soluzione approvata. –

-2

Questo codice funziona abbastanza bene: -

$dayNames = array(
    0=>'Sunday', 
    1=>'Monday', 
    2=>'Tuesday', 
    3=>'Wednesday', 
    4=>'Thursday', 
    5=>'Friday', 
    6=>'Saturday', 
); 

Ora, per esempio, si vuole ottenere il qualsiasi giorno dalla serie: -

echo $dayNames[1]; //Output:- Monday 
2

Il modo "solito" è quello di iniziare con un dato last day e contare fino al giorno su ogni iterazione.

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