C ++ strftime%b无法按预期工作

时间:2013-04-12 08:56:13

标签: c++ datetime locale strftime

我想在不同的语言环境中使用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

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

输出显示正确。

“avril”是“avril”Reference的合法缩写。

“Avr”也是“avril”的缩写。法语月份“juin”和“juillet”,均以相同的3个字母开头,表明使用前3个字母并不总是有效。

C ++没有指定如何缩写默认语言环境以外的月份名称。因此,假设缩写很短,在一个语言环境中的相同长度或在世界各种OS中实现相同的长度是有问题的。

建议检查strftime()的返回值。