【发布时间】:2017-06-22 18:47:20
【问题描述】:
我正在制作一个必须跟踪与书籍相关的日期的项目。我将日期存储为字符串。我需要打印出在给定日期之后出版的所有书籍。
下面是一个类似于我在代码中所做的循环,它复制了两个日期的值比较不一致的问题。
#include <time.h>
#include <stdio.h>
#include <string>
#include <ctime>
#include <vector>
int main()
{
std::string comp_against = "11/1995";
std::vector<std::string> dates = {"11/1995", "10/1990", "03/2004", "2/1992", "11/1995"};
for(auto it = dates.begin(); it != dates.end(); ++it)
{
std::string date = *it;
struct tm t1;
struct tm t2;
// parse the dates with mm/YYYY format
strptime(comp_against.c_str(), "%m/%Y", &t1);
strptime(date.c_str(), "%m/%Y", &t2);
std::time_t s1 = mktime(&t1);
std::time_t s2 = mktime(&t2);
printf("%s > %s: %s\n", date.c_str(), comp_against.c_str(), (s2 > s1 ? "true" : "false"));
}
return 0;
}
我电脑上的输出:
11/1995 > 11/1995: false <- these two are different
10/1990 > 11/1995: false |
03/2004 > 11/1995: true |
2/1992 > 11/1995: false |
11/1995 > 11/1995: true <- these two are different
当我运行我的实际代码时,问题正好相反。当在第一次迭代的循环开始时将日期“11/1995”与自身进行比较时,s2>s1 的计算结果为true,而不是像上面的输出那样false,第二次比较的计算结果为false .
编辑:
如果我与 difftime 进行比较,我会遇到同样的问题。在上面代码中的printf之后添加printf("%s > %s: %s\n", date.c_str(), comp_against.c_str(), (difftime(s2, s1) > 0.0 ? "true" : "false"));和printf("\n");,你会得到下面的输出。
11/1995 > 11/1995: false <- different
11/1995 > 11/1995: false |
10/1990 > 11/1995: false |
10/1990 > 11/1995: false |
03/2004 > 11/1995: true |
03/2004 > 11/1995: true |
2/1992 > 11/1995: false |
2/1992 > 11/1995: false |
11/1995 > 11/1995: true |
11/1995 > 11/1995: true <- different
【问题讨论】: