【问题标题】:Convert a time (UTC ) given as a string to local time将作为字符串给出的时间 (UTC) 转换为本地时间
【发布时间】:2014-12-10 07:12:39
【问题描述】:

我有一个像“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;
}

【问题讨论】:

  • 您对sscanf_s 的调用要求输入值以冒号分隔,而实际上不是。
  • 谢谢..我的错,我现在更正了代码..但是问题仍然存在:(
  • %d%d%d 不起作用,因为该函数会将“132233”视为单个数字...
  • 对代码进行了相当多的修改;)..但是运行时错误很顽固..我正确使用了 mktime 吗?
  • 尝试使用 strptime?这里似乎是正确的解决方案。你得到 struct tm *tm,使用 mktime 你可以把它转换成 time_t。

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


【解决方案1】:

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

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

由于这不能由 32 位 time_t 表示,mktime 函数失败并返回 -1,这是您不检查的情况。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2011-06-13
    • 2020-11-22
    • 2016-10-03
    • 2015-12-19
    • 1970-01-01
    • 2018-07-27
    相关资源
    最近更新 更多