ユーザーにローカライズされた曜日名(「月曜日」、「火曜日」など)のリストをフォームに表示する必要があります。私はどんな日付の曜日名を取得する方法を知っています。しかし、配列内の終日名を取得するための特定の失敗防止の方法はありますか。
編集:翻訳ファイルに曜日の名前を追加することはできますが、それを維持するのは困難です。
strftime()
を setlocale()
と組み合わせて使用することはオプションです。
ただし、スレッド化されたphpインストールでは、ロケール情報がスレッドごとではなくプロセスごとに維持されるため、setlocale()
が予期しない動作をする可能性があることに注意してください。そのため、setlocale()
を呼び出す前に、毎回strftime()
を呼び出して、正しいロケールを使用することを保証することが重要です。
また、Windowsシステムの場合、setlocale()
の$locale
パラメーターに多少変わった文字列を使用する必要があります。
これらの問題の両方の詳細については、ドキュメントを参照してください。
このようなものが機能するはずです:
// 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 );
$date = '2011/10/14';
$day = date('l', strtotime($date));
echo $day;
$dayNames = array(
'Sunday',
'Monday',
'Tuesday',
'Wednesday',
'Thursday',
'Friday',
'Saturday',
);
かなりフェイルプルーフです:)
さらに深刻なことに、PHPBBのようなものは、ローカリゼーションファイルを定義し、さまざまな言語にハードコーディングすることでこれを実現します。これが本当にこれを確実に行う唯一の方法です。
そのようなものをダウンロードし、コードを見てそれがどのように行われるかを確認することをお勧めします。
「通常の」方法は、指定されたlast day
から開始し、各反復で1日をカウントアップすることです。
for ($i = 0; $i < 7; $i++) {
$weekDayNames[] = strftime("%a", strtotime("last sunday +$i day"));
}
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順序をそのまま維持します。
久しぶりですが、どうでしょうか。
$timestamp = strtotime('next Sunday');
$days = array();
for ($i = 0; $i < 7; $i++) {
$days[] = strftime('%A', $timestamp);
$timestamp = strtotime('+1 day', $timestamp);
}
from phpで曜日名の配列を作成する方法