Получение имен дней в 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