- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究一个 C++ 函数,该函数应该确定指定事件是否发生在两个时间点之间。事件名称、开始日期时间和结束日期时间都作为字符串从 Lua 传入。因此,我需要将日期时间字符串解析为 time_t 变量。根据我在 StackOverflow 和其他论坛上看到的内容,这段代码应该有效:
time_t tStart;
int yy, month, dd, hh, mm, ss;
struct tm whenStart = {0};
const char *zStart = startTime.c_str();
sscanf(zStart, "%d/%d/%d %d:%d:%d", &yy, &month, &dd, &hh, &mm, &ss);
whenStart.tm_year = yy - 1900;
whenStart.tm_mon = month - 1;
whenStart.tm_mday = dd;
whenStart.tm_hour = hh;
whenStart.tm_min = mm;
whenStart.tm_sec = ss;
whenStart.tm_isdst = -1;
tStart = mktime(&whenStart);
然而,这里的 tStart 似乎被赋予了 -1 的值。如果我使用 strftime 从 whenStart 重建一个字符串,那么 tm 结构似乎已经完全正确地制作了。我认为 mktime() 不知何故不喜欢这种结构。这段代码有什么问题?
此外,在您回答之前,请知道我已经尝试过使用 strptime() 调用。由于我不清楚的原因,此函数被拒绝并出现“未定义对‘strptime’的引用”错误。 various descriptions I've found关于如何解决这个问题只会破坏我正在使用的代码库的其余部分,所以我宁愿避免搞乱 _XOPEN_SOURCE 或类似的重新定义。
感谢您的帮助!
最佳答案
您发布的代码是正确的。
这让我相信您的输入字符串 (startTime
) 不是您期望的格式,因此 sscanf
无法解析出这些值。
示例:
#include <iostream>
int main()
{
std::string startTime = "2016/05/18 13:10:00";
time_t tStart;
int yy, month, dd, hh, mm, ss;
struct tm whenStart;
const char *zStart = startTime.c_str();
sscanf(zStart, "%d/%d/%d %d:%d:%d", &yy, &month, &dd, &hh, &mm, &ss);
whenStart.tm_year = yy - 1900;
whenStart.tm_mon = month - 1;
whenStart.tm_mday = dd;
whenStart.tm_hour = hh;
whenStart.tm_min = mm;
whenStart.tm_sec = ss;
whenStart.tm_isdst = -1;
tStart = mktime(&whenStart);
std::cout << tStart << std::endl;
}
输出:
1463595000
您是否仔细检查过您的输入?
请注意,您可以检查 sscanf
的返回值验证它是否按预期工作。
Return value
Number of receiving arguments successfully assigned, or EOF if read failure occurs before the first receiving argument was assigned.
如果返回值不是6,则说明输入的字符串不正确。
int num_args = sscanf(zStart, "%d/%d/%d %d:%d:%d", &yy, &month, &dd, &hh, &mm, &ss);
if (num_args != 6)
{
std::cout << "error in format string " << startTime << '\n';
return 1;
}
根据经验,您永远不应该假设您的输入是正确的。因此,defensive programming养成一个好习惯。
关于C++ 将字符串转换为 time_t 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37306895/
我想将日期时间字符串保存到 time_t,然后将其转换回完全原始的字符串。 但是下面的代码会输出"2016-04-25_10:10:05" 并且通过更改 date_str,输出中的小时将不正确。 如果
我有两个 time_t 变量:timeA 和 timeB。 我想做的是检查 timeA 是否与 timeB 相同。但是,我知道在某些情况下它们不会完全相同,两者之间可能会有 1 或 2 秒的差异,所以
我正在尝试编写函数来帮助自己轻松地将 string 转换为 time_t 并将 time_t 转换为 string。然而,它总是给我错误的一年和一个错误的时间。怎么了? 我需要它独立于操作系统! 例如
time_t raw_time = time(NULL); tm* current_time = localtime(&raw_time); 我自己得到了答案......我完全搞砸了警告。无论如何谢谢
我的 time_t 值为 1530173696,代表 2018 年 6 月 28 日,星期四 8:14:56 AM。 我想将时间向下舍入到最接近的小时。具体来说,向下到 1530172800,代表 T
我正在开发嵌入式系统。我们的平台是 32 位,因此 time_t 大小是 32 位。 现在我想将一个结构作为 char 数组发送到 Windows 7 计算机。我的结构体的字段之一是time_t。我无
time_t 这是依赖于平台的类型。我发现 difftime 以秒为单位返回差异,但我没有找到无需任何转换即可进行简单减法的函数。我怎么知道标准不保证在整个时间连续体中始终如一,并且没有说明有关 ti
我正在尝试转换 static char bufferTR[] = "1645"; 像这样的事情...... struct tm *tick_time = localtime(&temp); 在此函数中
在我当前的项目中,我有一个 C 结构来保存时间戳,如下所示: struct timestamp { uint16_t year; uint8_t month; uint8_t day
我有从 2004 年到特定日期的毫秒数。我想将其转换为 time_t 以使用 ctime() 显示它? 也许还有另一种方法可以通过这个毫秒时间戳来可视化日期,有人有吗? 最佳答案 假设“从 2004
我应该如何修改此代码以在每 00:00AM 打印(“Its Midnight”)? #include #include int main(void) { struct tm * localti
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
我是 C 编程新手,我需要一些帮助来完成一个简单的任务。 所以我有这个功能: char *time2str(time_t time) { static_char *str_fmt = "%0
我正在使用处理 time_t 的 API。现在我也有一个来自 API 的结果,它也在 time_t 中检索数据,但问题是第一个只需要日期、小时和分钟,但我检索的数据包括秒,我如何从数据中删除秒>
我正在尝试将“Tue Feb 13 00:26:36 2018”转换为 time_t,我该怎么做,我尝试寻找一个函数但找不到。这是使用非托管 C++。 最佳答案 如果你使用的是 C++11,你可以这样
我有一个 double 的纪元,需要传入一个需要 time_t 的函数。如何将 double 中的纪元转换为 time_t?我在 Linux 上使用 C++ 代码。谢谢。 最佳答案 如果你在 doub
根据 http://www.cplusplus.com/reference/clibrary/ctime/time_t/ time_t 是自 1970 年 1 月 1 日午夜 UTC 以来的秒数。因此
我试图找出时间将溢出 time_t 值的日期 #include #include #include main(){ time_t now,end; now=time(NU
如果我有这个字符串: 2011-10-08T07:07:09Z 是否有可能从中获取time_t?如果可以,如何实现? 最佳答案 是的,是的。首先,使用 strptime(3) 将其转换为 segmen
我不明白为什么这会抛出undefined reference to `floor'”: double curr_time = (double)time(NULL); return floor(curr
我是一名优秀的程序员,十分优秀!