在PHP中检索日名称
我需要在表单中向用户显示本地化日期名称的列表(如“星期一”、“星期二”和…)。我知道如何获得任何日期的日期名称。但是,是否有一种特殊且防故障的方法来获取数组中的全天名称 编辑:我可以在翻译文件中添加日期名称,但这很难维护在PHP中检索日名称,php,date,locale,Php,Date,Locale,我需要在表单中向用户显示本地化日期名称的列表(如“星期一”、“星期二”和…)。我知道如何获得任何日期的日期名称。但是,是否有一种特殊且防故障的方法来获取数组中的全天名称 编辑:我可以在翻译文件中添加日期名称,但这很难维护 $dayNames = array( 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', ); 是非常
$dayNames = array(
'Sunday',
'Monday',
'Tuesday',
'Wednesday',
'Thursday',
'Friday',
'Saturday',
);
是非常防故障的:)
更重要的是,PHPBB这样的公司通过定义本地化文件和不同语言的硬编码来实现这一点。这是唯一可靠的方法
我建议下载类似的东西并查看代码,看看它是如何完成的
setlocale(LC_TIME,'de_de');
$today=(86400*(日期)(“N”);
对于($i=0;$i<7;$i++){
$days[]=strftime('%A',time()-$today+($i*86400));
}
打印(天);
显然可以通过不调用time()7次等来优化,但这就是要点。它为您提供了适用于区域设置的正确语言,并使Sun Sat阵列的顺序保持得体。结合使用是一个选项
但是,您应该注意,在线程化php安装上,setlocale()
可能会表现出意外的行为,因为区域设置信息是按进程而不是按线程维护的。因此,每次调用strftime()
之前都要调用setlocale()
,以确保使用正确的区域设置,这一点很重要
另外,对于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 );
//定义setlocale()的区域设置,我们需要这些区域设置的日名称
$locales=array(
"恩",,
“德乌德”,
“nl_nl”
//等等。。。
);
//请注意,setlocale()在Windows计算机上需要不同的值
//有关更多信息,请参阅setlocale()上的文档
$locales=array(
“英语”,
“德语”,
“荷兰语”
//等等。。。
);
//让我们记住当前的本地设置
$oldLocale=setlocale(LC_时间,'0');
//初始化输出结果数组
$localizedWeekdays=array();
//循环每个区域设置
foreach($locales作为$locale)
{
//为此区域设置创建子结果数组
$localizedWeekdays[$locale]=array();
//一周7天
对于($i=0;$i<7;$i++)
{
//在每次迭代中再次设置区域设置
setlocale(LC_TIME,$locale);
//将strftime()与漂亮的strotime()组合起来
$localizedWeekdays[$locale][]=strftime('%A',strotime('next Monday+'.$i.'days'));
//出于礼貌,重置其他线程的区域设置
setlocale(LC_时间,$oldLocale);
}
}
//这是多维数组中的结果
var_dump(本地化的工作日);
我知道已经很久了,但是:
$timestamp = strtotime('next Sunday');
$days = array();
for ($i = 0; $i < 7; $i++) {
$days[] = strftime('%A', $timestamp);
$timestamp = strtotime('+1 day', $timestamp);
}
$timestamp=strottime('nextsunday');
$days=array();
对于($i=0;$i<7;$i++){
$days[]=strftime('%A',$timestamp);
$timestamp=STROTIME(“+1天”,$timestamp);
}
从中,此代码将非常有效:-
$dayNames = array(
0=>'Sunday',
1=>'Monday',
2=>'Tuesday',
3=>'Wednesday',
4=>'Thursday',
5=>'Friday',
6=>'Saturday',
);
现在,例如,您希望从阵列中获取任意一天:-
echo $dayNames[1]; //Output:- Monday
“通常”的方法是从给定的最后一天开始
,并在每次迭代中计算一天
for ($i = 0; $i < 7; $i++) {
$weekDayNames[] = strftime("%a", strtotime("last sunday +$i day"));
}
($i=0;$i<7;$i++)的{
$weekDayNames[]=strftime(“%a”,strotime(“上周日+i天”);
}
日期名称?你是说像星期一,星期二,星期三。。。等等?为什么不自己定义它们?这通常是最好的方式,因为询问date()
取决于众所周知不可靠的区域设置。(参考)(reference)任何本地化解决方案都需要在您的总体本地化策略中加以考虑。Vascowhite的解决方案不一定是特定于语言环境的,但可以作为许多不同本地化解决方案的基础。请看我的评论,并注意他的调整。如果您使用日期的数字索引,这将允许您获得一个可预测的字符串,然后您可以将其用作返回本地化字符串的键。很难为所有语言维护,这让我很难过。如果您要这样做,应该是“星期日”…'“星期六”与从日期(“w”)返回的时间一致,其中星期日是第0个元素。我看不出此解决方案与已批准的解决方案之间有任何区别。工作后它突然不起作用,我停止了apache!现在返回的是数字而不是日期名称…感谢您保存我的日期。请注意,本地化的工作日是在windows-1250
中返回的,而不是utf-8
。可能需要额外的编码转换,例如通过iconv
。在Win64 PHP7.0上测试。
echo $dayNames[1]; //Output:- Monday
for ($i = 0; $i < 7; $i++) {
$weekDayNames[] = strftime("%a", strtotime("last sunday +$i day"));
}