如何使用我自己的值填充tm结构,然后打印出来?

时间:2014-10-22 15:12:18

标签: c++ iomanip

我想用小时,分钟和秒的自定义值填充我的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");

给了我相同的输出。我忘了提到我也试过了。

2 个答案:

答案 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_mdaytm_montm_year设置为合法值以输出时间。

通过评论,您似乎可以将您的年/月/日信息加倍。我认为你应该可以做put_time(tmTime, tmTime->tm_year > -1990 ? "%A, %B %e %Y AD, %r" : "%A, %B %e %Y BC, %r");

之类的事情
相关问题