如何获得指定时间之前的剩余秒数

时间:2013-03-12 13:36:31

标签: c++ datetime epoch

我希望以下方法能够返回当前一天中特定时间之前剩余的秒数。例如,如果当前时间是“19:00”,则GetRemainedSeconds("19:01")应该返回60,表示在给定时间之前剩余60秒。调用GetRemainedSeconds("18:59")应返回-60。问题是以下函数显示随机行为。有时它返回正确的值,有时它不返回(即使在同一台机器上运行)。这段代码有什么问题?

int GetRemainedSeconds ( const std::string &timeString, bool &isValid )
{
    struct tm when;
    char* p;

    p = strptime ( timeString.c_str(), "%H:%M", &when );

    if ( p == NULL || *p != '\0' )
    {
        std::cout << "Invalid 24h time format" << std::endl;
        isValid = false;
        return 0;
    }

    struct tm  now;

    isValid = true;
    time_t nowEpoch = time ( 0 ); // current epoch time

    struct tm tmpTime;
    now = *localtime_r ( &nowEpoch, &tmpTime );

    when.tm_year = now.tm_year;
    when.tm_mon = now.tm_mon;
    when.tm_mday = now.tm_mday;
    when.tm_zone = now.tm_zone;
    when.tm_isdst = now.tm_isdst; 
    time_t whenEpoch = mktime ( &when );

    return ( whenEpoch - nowEpoch );
}

2 个答案:

答案 0 :(得分:2)

您需要将when.tm_sec设置为某个值(可能为零)。它包含上次调用时堆栈上发生的任何垃圾,这不是你想要的。

是的,您还应该将when.tm_isdst设置为有意义的内容。

答案 1 :(得分:0)

这是一个问题:

when.tm_isdst = when.tm_isdst;

你正在为自己设置when.tm_isdst,这只是一些未初始化的垃圾。

我想你想说:

when.tm_isdst = now.tm_isdst;