Получение имен дней в PHP

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

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

Ответ 1

Использование 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 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

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

Ответ 3

$dayNames = array(
    'Sunday',
    'Monday', 
    'Tuesday', 
    'Wednesday', 
    'Thursday', 
    'Friday', 
    'Saturday', 
 );

Довольно неудачно:)

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

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

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

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

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

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

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