【问题标题】:C++ mktime returning random datesC++ mktime 返回随机日期
【发布时间】:2015-02-05 17:02:07
【问题描述】:

我正在尝试将日期字符串转换为 time_t,但 mktime() 正在返回看似随机的日期:

string datetime = "2014-12-10 10:30";
struct tm tmInfo;
strptime(datetime.c_str(), "%Y-%m-%d %H:%M", &tmInfo);
tmInfo.tm_isdst = 0;
time_t eventTime = mktime(&tmInfo);

eventTime 从 1970 年代到 2030 年代的范围很广。 tmInfo 结构包含正确的日期,因此错误必须发生在 mktime() 中。有什么想法吗?

【问题讨论】:

  • 似乎是work for meeventTime1418203800 的形式出现在正确的球场上。

标签: c++ c datetime time


【解决方案1】:

在调用strptime() 之前,您需要对struct tm 实例的所有其他字段进行正确的零初始化,因为它不一定会初始化每个字段。来自strptime() POSIX specification

未指定使用同一 tm 结构多次调用 strptime() 是否会更新结构的当前内容或覆盖结构的所有内容。符合要求的应用程序应使用格式和所有数据对 strptime() 进行一次调用,以完全指定要转换的日期和时间。

例如,这应该足够了:

struct tm tmInfo = {0};

【讨论】:

  • 事先将 tmInfo 设置为 { 0 },谢谢!因为解释,我接受了你的回答。
【解决方案2】:

您必须事先将结构初始化为 0 或输入秒数:

string datetime = "2014-12-10 10:30";
struct tm tmInfo = { 0 };
strptime(datetime.c_str(), "%Y-%m-%d %H:%M", &tmInfo);

string datetime = "2014-12-10 10:30:00";
struct tm tmInfo;
strptime(datetime.c_str(), "%Y-%m-%d %H:%M:%S", &tmInfo);

【讨论】:

  • 事先将 tmInfo 设置为 { 0 },谢谢!
  • 天哪!终于找到这个答案了,非常感谢!我遇到了同样的问题!好头疼……
【解决方案3】:

如果你想要当前系统时间的格式,下面的代码可以完成这项工作

 time_t current_time;
 struct tm *loctime;

 memset(buffer,0,strlen(buffer));
 current_time = time(NULL);
 loctime = localtime(&current_time);
 strftime(buffer,250,"--> %d/%m/%y  %H:%M:%S",loctime);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-13
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多