从内置C库获取月份名称的各种方法

时间:2010-02-28 07:42:29

标签: c++ c

通过内置C / C ++获取月份名称的各种方法有哪些方法,对应于整数值[ 0表示0,2表1,... 12表示12月]图书馆,我对strftime很熟悉。还有其他方法吗?

2 个答案:

答案 0 :(得分:3)

#include <langinfo.h>
#include <locale.h>
#include <stdio.h>
int main() {
    const nl_item nl_abmons[12] = {ABMON_1, ABMON_2, ABMON_3, ABMON_4,
                                   ABMON_5, ABMON_6, ABMON_7, ABMON_8,
                                   ABMON_9, ABMON_10, ABMON_11, ABMON_12};
    const nl_item nl_months[12] = {MON_1, MON_2, MON_3, MON_4, MON_5, MON_6,
                                   MON_7, MON_8, MON_9, MON_10, MON_11, MON_12};
    int i;
    setlocale(LC_ALL, "");
    for (i = 0; i < 12; i++) {
        printf("%d\t%s\t%s\n",
                i+1, nl_langinfo(nl_abmons[i]), nl_langinfo(nl_months[i]));
    }
    return 0;
}
$ cc months.c
$ LANG=ja_JP.utf8 ./a.out
1        1月    1月
2        2月    2月
3        3月    3月
4        4月    4月
5        5月    5月
6        6月    6月
7        7月    7月
8        8月    8月
9        9月    9月
10      10月    10月
11      11月    11月
12      12月    12月
$ LANG=ru_RU.utf8 ./a.out
1       Янв     Январь
2       Фев     Февраль
3       Мар     Март
4       Апр     Апрель
5       Май     Май
6       Июн     Июнь
7       Июл     Июль
8       Авг     Август
9       Сен     Сентябрь
10      Окт     Октябрь
11      Ноя     Ноябрь
12      Дек     Декабрь
$ LANG=de_DE.utf8 ./a.out
1       Jan     Januar
2       Feb     Februar
3       Mär     März
4       Apr     April
5       Mai     Mai
6       Jun     Juni
7       Jul     Juli
8       Aug     August
9       Sep     September
10      Okt     Oktober
11      Nov     November
12      Dez     Dezember

在我所知道的所有实现中都会发生这种情况MON_1..MON_12是顺序的,所以这可以写成for (i = 0; i < 12; i++) printf("%d %s\n", i+1, nl_langinfo(MON_1+i));具有相同的实际效果,但我不认为在任何地方的文档中都有保证。

答案 1 :(得分:0)

// For Windows systems, using LCID
LCID lcid = MAKELANGID(LANG_FRENCH,SUBLANG_FRENCH_CANADIAN);
TCHAR szMonth[12][20] = {0};
for (int i=0;i<12;i++)
{
    if ( ::GetLocaleInfo(lcid, LOCALE_SMONTHNAME1+i, szMonth[i], ARRAY_COUNT(szMonth[i])) )
        szMonth[i][0]=_toupper(szMonth[i][0]); // For better formatting ( French for instance)
}

注意:目标语言的LCID可以从exe资源中读取(使用VerQueryValue(...,_ T(“\ VarFileInfo \ Translation”),...),或使用{{3宏