Получение названий дней в PHP - PullRequest
10 голосов
/ 14 октября 2011

Мне нужно отобразить пользователю список локализованных названий дней (например, «Понедельник», «Вторник», ...) в форме.Я знаю, как получить название дня на любую дату.Но есть ли конкретный и безошибочный способ получить все дневные имена в массиве.

Изменить: я мог бы добавить названия дней в мой файл перевода, но это трудно поддерживать.

Ответы [ 7 ]

33 голосов
/ 14 октября 2011
$date = '2011/10/14'; 
$day = date('l', strtotime($date));
echo $day;
13 голосов
/ 14 октября 2011

Использование strftime() в сочетании с setlocale() является опцией.

Однако вы должны знать, что на многопоточных установках php setlocale() может вести себя неожиданно, поскольку информация о локали поддерживается для каждого процесса, а не для каждого потока. Поэтому важно каждый раз вызывать setlocale() перед каждым вызовом strftime(), чтобы гарантировать, что он использует правильную локаль.

Кроме того, для систем Windows вам нужно использовать несколько необычные строки для параметра $locale для setlocale().

См. Документы для получения дополнительной информации по обоим этим вопросам.

Примерно так должно работать:

// 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 );
2 голосов
/ 30 апреля 2015

«Обычный» способ - начать с заданного last day и подсчитать день на каждой итерации.

for ($i = 0; $i < 7; $i++) {
  $weekDayNames[] = strftime("%a", strtotime("last sunday +$i day"));
}
2 голосов
/ 14 октября 2011
$dayNames = array(
    'Sunday',
    'Monday', 
    'Tuesday', 
    'Wednesday', 
    'Thursday', 
    'Friday', 
    'Saturday', 
 );

является довольно надежным:)

На более серьезном замечании, подобные PHPBB делают это, определяя файлы локализации и жесткое кодирование для разных языков.Это действительно единственный способ сделать это надежно.

Я бы порекомендовал скачать что-то подобное и посмотреть на код, чтобы увидеть, как это делается.

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

0 голосов
/ 07 июня 2014

Этот код будет работать очень хорошо: -

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

Теперь, например, вы хотите получить любой день из массива: -

echo $dayNames[1]; //Output:- Monday
0 голосов
/ 14 октября 2012

Я знаю, это было давно, но как насчет:

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

из как создать массив имен дней недели в php

0 голосов
/ 14 октября 2011
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);

Очевидно, что можно оптимизировать, не вызывая time () 7 раз и т. Д., Но это суть.Это дает вам правильный язык для локали и поддерживает порядок следования массива в режиме Sun-Sat.

...