我想在不同的语言环境中使用C ++打印时间戳,我在一个特定的主机中为fr_FR获得了奇怪的输出。
这是代码,
#include <time.h> /* time_t, struct tm, time, localtime, strftime */
#include <stdlib.h>
#include <locale.h>
#include <clocale>
#include <iostream>
using namespace std;
int main()
{
time_t rawtime;
struct tm * timeinfo;
char buffer [32];
setlocale(LC_ALL, "");
cout << "LC_ALL: " << setlocale(LC_ALL, NULL) << endl;
cout << "LC_CTYPE: " << setlocale(LC_CTYPE, NULL) << endl;
time (&rawtime);
timeinfo = localtime (&rawtime);
strftime (buffer,sizeof(buffer),"%a %b %d %H:%M:%S %Y %Z",timeinfo);
puts (buffer);
return 0;
}
在运行上述程序之前,我做了
export LANG=fr_FR.ISO8859-1
它提供输出,
LC_ALL: fr_FR.ISO8859-1
LC_CTYPE: fr_FR.ISO8859-1
ven. avril 12 08:49:55 2013 UTC
它为%b和%B提供相同的输出,当我在另一台机器中检查时,它按预期工作。输出,
LC_ALL: fr_FR.ISO8859-1
LC_CTYPE: fr_FR.ISO8859-1
jeu avr 11 23:26:24 2013 PDT
在一台机器上,
$date +%b
avr
$date +%B
avril
在problamatic机器中,
$date +%b
avril
$date +%B
avril
请帮我解决这个问题。
答案 0 :(得分:0)
输出显示正确。
“Avr”也是“avril”的缩写。法语月份“juin”和“juillet”,均以相同的3个字母开头,表明使用前3个字母并不总是有效。
C ++没有指定如何缩写默认语言环境以外的月份名称。因此,假设缩写很短,在一个语言环境中的相同长度或在世界各种OS中实现相同的长度是有问题的。
建议检查strftime()
的返回值。