0

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

提前感谢您的帮助。

编辑:输出的示例:

"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");

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

4

2 回答 2

2

在这一行中,

struct std::tm *tmTime;

您有一个尚未初始化的指针。在接下来的几行中,您将使用未初始化的指针来访问结构的成员。这是未定义行为的原因。

正如 πάντα ῥεῖ 在评论中所建议的,您需要使用:

struct std::tm tmTime;
tmTime.tm_hour = hour_;
tmTime.tm_min = minute_;
tmTime.tm_sec = second_;
于 2014-10-22T15:26:10.927 回答
1

我同意R Sahu的观点,这应该对你有用。你用的是什么编译器?您可能有一个未初始化hour_minute_, 或second_. 或者可能put_time需要tm_mday,tm_montm_year设置为合法值以及输出时间。

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

于 2014-10-22T16:26:17.127 回答