我想用小时、分钟和秒的自定义值填充我的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结构(这显然不是我想要做的)。
所以。。如果小时、分钟和秒都等于0,我希望它在的12:00:00打印
提前感谢您的帮助。
EDIT:输出的示例:
"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");
给了我相同的输出。我忘了提我也试过了。
在这一行中,
struct std::tm *tmTime;
您有一个尚未初始化的指针。在接下来的几行中,您将使用未初始化的指针来访问结构的成员。这就是未定义行为的原因。
正如πάΓτα的评论所建议的那样ῥεῖ,您需要使用:
struct std::tm tmTime;
tmTime.tm_hour = hour_;
tmTime.tm_min = minute_;
tmTime.tm_sec = second_;
我同意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");
的操作