我想用小时,分钟和秒的自定义值填充我的tm结构,然后使用std :: put_time()输出它。
我的代码位于一个to_string函数内,用于保存日期和时间的自定义类:
std::string Gregorian::to_string() const {
std::ostringstream oss;
struct std::tm *tmTime;
//This is where I add my custom time values
tmTime->tm_hour = hour_;
tmTime->tm_min = minute_;
tmTime->tm_sec = second_;
oss << civil::day_name( day_of_week( to_jd() ) ) << ", ";
oss << gregorian_month_name( month_ ) << ' ' << (unsigned) day_ << ' ';
if( year_ <= 0 )
oss << (-year_ + 1) << " BCE";
else
oss << year_ << " CE, ";
//i'm trying to use std::put_time here but it prints nothing
oss << std::put_time(tmTime, "%r");
return oss.str();
}
我错过了重要的事情吗?我一直在网上阅读这篇文章。我见过的所有例子都使用本地时间来填充tm结构(这显然不是我想要做的)。
所以..如果hour_,minute_和second_都等于0,我希望它打印上午12:00:00
提前感谢您的帮助。
编辑:输出结果的示例:
"Wednesday, January 1 1000 CE, "
“CE”之后的空格应该是时间。
另外,将其更改为:
struct std::tm tmTime;
tmTime.tm_hour = hour_;
tmTime.tm_min = minute_;
tmTime.tm_sec = second_;
和
oss << std::put_time(&tmTime, "%r");
给了我相同的输出。我忘了提到我也试过了。
答案 0 :(得分:2)
在这一行中,
struct std::tm *tmTime;
你有一个尚未初始化的指针。在接下来的几行中,您使用未初始化的指针来访问结构的成员。这是未定义行为的原因。
正如πάνταῥεῖ的评论所示,您需要使用:
struct std::tm tmTime;
tmTime.tm_hour = hour_;
tmTime.tm_min = minute_;
tmTime.tm_sec = second_;
答案 1 :(得分:1)
我同意R Sahu,这应该对你有用。
你用的是什么编译器?您可能有未初始化的hour_
,minute_
或second_
。或者可能put_time
需要tm_mday
,tm_mon
和tm_year
设置为合法值以输出时间。
通过评论,您似乎可以将您的年/月/日信息加倍。我认为你应该可以做put_time(tmTime, tmTime->tm_year > -1990 ? "%A, %B %e %Y AD, %r" : "%A, %B %e %Y BC, %r");