将作为字符串给出的时间(UTC)转换为本地时间

时间:2014-10-15 09:10:00

标签: c++ string pointers visual-c++ time.h

我有一个像这样的时间字符串“132233”(时间只有没有日期),我想把它转换成当地时间。 因此,为了使用函数localtime(),我首先使用mktime()将我的字符串转换为time_t(感谢How to convert a string variable containing time to time_t type in c++?),然后使用strftime打印转换后的时间,如(http://www.cplusplus.com/reference/ctime/strftime/所示) 我收到严重的运行时错误。任何人都可以告诉我什么是错的。提前致谢

int main()
{
    string time_sample="132233";

    std::string s_hrs (time_sample.begin(), time_sample.begin()+2);                                                 
    std::string s_mins (time_sample.begin()+2,time_sample.begin()+4);
    std::string s_secs (time_sample.begin()+4,time_sample.begin()+6);

    int hrs = atoi(s_hrs.c_str());
    int mins = atoi(s_mins.c_str());
    int secs = atoi(s_secs.c_str());

    struct tm time_sample_struct = {0};
    time_sample_struct.tm_hour = hrs;
    time_sample_struct.tm_min = mins;
    time_sample_struct.tm_sec = secs;

    time_t converted_time;
    converted_time = mktime(&time_sample_struct);

    struct tm * timeinfo;
    char buffer[80];
    timeinfo = localtime(&converted_time);
    strftime(buffer,80,"%I:%M:%S",timeinfo);
    puts(buffer);                                                               
    cout<<endl;
    getch();
    return 0;
}

1 个答案:

答案 0 :(得分:0)

您的问题是,如果time_t是32位值,那么它能够编码的最早可能日期(给定1970-1-1纪元)是1901-12-13。

但是,您没有设置tm结构的日期字段,这意味着它默认为0-0-0代表1900-1-0(因为tm_day是1基于,你实际上最终会得到一个无效的日期。)

由于这不能由32位time_t表示mktime功能失败并返回-1,因此您不会检查这种情况。< / p>

最简单的解决方法是将tm结构的日期字段初始化为time_t可以表示的内容:

time_sample_struct.tm_year = 114;
time_sample_struct.tm_mday = 1;