两天前,我开始编写一些我认为非常简单的代码:将日期字符串格式化为保存在mysql的DATE字段中,从“YYYY-MM-DD”格式化为用户提供的格式。从那以后,我一直陷入语言环境问题。
#include <iostream>
#include <ctime>
std::string fdate(std::string date, std::string format) {
char buf[50];
int year, month, day;
std::tm tm;
sscanf(date.c_str(), "%d-%d-%d", &year, &month, &day);
tm.tm_year = year - 1900;
tm.tm_mon = month - 1;
tm.tm_mday = day;
// std::cout << "std::cout locale: " << std::cout.getloc().name() << std::endl;
strftime(buf, sizeof(buf), format.c_str(), &tm);
return buf;
}
int main() {
std::locale::global(std::locale(""));
std::cout.imbue(std::locale());
std::string format("%a %d %b %Y");
std::string day("2018-04-14");
std::string formatted_day = fdate(day, format);
std::cout << "std::cout locale: " << std::cout.getloc().name() << std::endl;
std::cout << day << " => " << formatted_day << std::endl;
return 0;
}
以上代码输出:
std :: cout locale:en_GB.utf8
2018-04-14 =&gt; ? 2018年4月14日
请注意,“%a”应输出星期几的短英文名称,即“Sun”。取而代之的是“?”输出,因为由于某些我不理解的原因,缺少strftime()所需的语言环境信息。
如果我取消注释上述方法中注释掉的行,则输出变为:
std :: cout locale:en_GB.utf8
std :: cout locale:en_GB.utf8
2018-04-14 =&gt; Sun 2018年4月14日
在过去的两天里,我尝试了很多不同的变体,但上面的代码示例突出了一个令我困惑的事件。
为什么在方法中添加std :: cout语句“修复”问题?
有什么更好的方法来实现我最初的目标?
编辑:实际上2018-04-14是星期六!所以,我在我的代码中做了另一个错误的假设。如何填写std :: tm的缺失字段?鉴于YYYY-MM-DD日期,std库中是否有任何能够计算星期几的东西?