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



我想用小时、分钟和秒的自定义值填充我的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_mdaytm_montm_year设置为合法值来输出时间。

作为评论,你似乎在加倍强调你的年/月/日信息。我认为您应该能够执行类似put_time(tmTime, tmTime->tm_year > -1990 ? "%A, %B %e %Y AD, %r" : "%A, %B %e %Y BC, %r"); 的操作

最新更新