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