获取本地化月份列表

时间:2011-08-29 10:26:12

标签: php localization

由于PHP在intl扩展中使用来自ICU的数据,有没有办法从PHP中获取本地化的月份名称?

虽然我可以从ICU的xml文件中获取数据并将它们提取到我自己的文件集中,但如果可能的话,我更倾向于使用干净且简单的解决方案。

最后,考虑到intl扩展名中的语言环境,有没有办法获取日期格式(MM / DD / YYYY或DD / MM / YYYY)?

5 个答案:

答案 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');

等等