由于PHP在intl扩展中使用来自ICU的数据,有没有办法从PHP中获取本地化的月份名称?
虽然我可以从ICU的xml文件中获取数据并将它们提取到我自己的文件集中,但如果可能的话,我更倾向于使用干净且简单的解决方案。
最后,考虑到intl扩展名中的语言环境,有没有办法获取日期格式(MM / DD / YYYY或DD / MM / YYYY)?
答案 0 :(得分:4)
不确定您需要月份名称,但如果您只想使用已翻译的名称数月,strftime()
会根据当前区域设置使用名称(使用%B
修饰符)。< / p>
如果您想要其他用途的月份名称列表,您也可以使用strftime()
:
$months = array();
for( $i = 1; $i <= 12; $i++ ) {
$months[ $i ] = strftime( '%B', mktime( 0, 0, 0, $i, 1 ) );
}
对于第二个问题,它可能有一个原生功能但是自己制作一个并不难:
$currentDate = strftime( '%x', strtotime( '2011-12-13' ) );
$localFormat = str_replace(
array( '13', '12', '2011', '11' ),
array( 'DD', 'MM', 'YYYY', 'YY' ),
$currentDate
);
答案 1 :(得分:4)
您可以使用IntlDateFormatter::getPattern
来获取模式吗?我不知道strftime,但我会使用模式MMMM
的格式建议来获取每个月的月份名称。看起来php.intl不会直接暴露数据。
答案 2 :(得分:4)
(这不是一个真正的答案,它将是对Steven R. Loomis的答案的评论。我写的只是因为我无法在评论中格式化代码)
谢谢Steven R. Loomis,这是我的解决方案:
function local_month_name($locale, $monthnum)
{
/**
* Return the localized name of the given month
*
* @author Lucas Malor
* @param string $locale The locale identifier (for example 'en_US')
* @param int $monthnum The month as number
* @return string The localized string
*/
$fmt = new IntlDateFormatter($locale, IntlDateFormatter::LONG,
IntlDateFormatter::NONE);
$fmt->setPattern('MMMM');
return $fmt->format(mktime(0, 0, 0, $monthnum, 1, 1970));
}
答案 3 :(得分:0)
对于不使用磁偏角的英语或其他语言,它可以正常工作,但是对于所有使用磁偏角的语言,输出将无效。
对于波兰语,即March
的输出将是marca
而不是marzec
对于俄语,即March
的输出将是Мартa
而不是Март
此方法不适用于所有语言,这很可能是必需的,而且可能不会由不讲该语言的人轻松测试。
如果只需要月份的名称,最好使用:
setlocale(LC_TIME, 'pl_PL');
$month_name = strftime('%B', mktime(0, 0, 0, $month_number));
请记住,区域设置更改可能会影响应用程序的其他部分。
答案 4 :(得分:-1)
setlocale(LC_ALL, 'en_US.ISO_8859-1');
等等