C++ C++;获取两个日期之间的日期
我把每个日期都放在一个向量structC++ C++;获取两个日期之间的日期,c++,sorting,date-range,C++,Sorting,Date Range,我把每个日期都放在一个向量struct(vector): 日期格式为“YYYY-MM-DD HH:MM:SS” 我希望获取两个给定日期之间的日期(例如,从2016年1月1日到2016年2月1日)。如何做到这一点?在示例中,您可以这样做:将所有日期转换为time\t值(日期和时间的数字表示),然后遍历向量,并在三个时间数之间使用正常比较。参考:man mktime,man strptime在示例中,您可以这样做:将所有日期转换为time值(日期和时间的数字表示),然后迭代向量,并在三个时间数之间使
(vector)
:
日期格式为“YYYY-MM-DD HH:MM:SS”
我希望获取两个给定日期之间的日期(例如,从2016年1月1日到2016年2月1日)。如何做到这一点?在示例中,您可以这样做:将所有日期转换为
time\t
值(日期和时间的数字表示),然后遍历向量,并在三个时间数之间使用正常比较。参考:man mktime
,man strptime
在示例中,您可以这样做:将所有日期转换为time
值(日期和时间的数字表示),然后迭代向量,并在三个时间数之间使用正常比较。参考:man mktime
,man strtime
这个问题有两个方面:
C++使用TimeTyt对象作为一个有效日期数,从设置日期(1970年1月1日UTC)开始,在每种情况下,你可以认为这是一个以秒为单位的整数表示。 接下来,您需要知道如何将数据解析为时间戳:这里有一些非常有用的链接
我更喜欢的方法是——这里有一个例子。也是如果日期格式不常见,您可能需要考虑使用。在这种情况下,使用通常是最简单的方法-该函数的接口有点老派的“c风格”,但这并没有改变它工作正常的简单事实。
我在下面写的代码很接近#包括
#包括
时间\u t GetDateFromObject(值和日期\u对象)
{
char*Date\u String=Date\u Object.Date.c_str();
整数年、月、日、时、分、秒;
如果(sscanf(日期字符串,“%d-%d-%d%d:%d:%d”、&年、月、日、时、分、秒)==6)
{
时间与时间;
时间(&rawTime);
struct tm*parsedTime;
parsedTime=localtime(&rawTime);
//tm_年是自1900年以来的年份
解析时间->tm_year=year-1900;
//tm_月是自一月起的月份
parsedTime->tm_mon=month-1;
解析时间->tm_mday=天;
解析时间->tm_小时=小时;
解析时间->tm_min=分钟;
解析时间->tm_秒=秒;
返回mktime(parsedTime);
}
}
日期的关联和排序
一旦您知道如何从日期获取时间,您就可以开始创建一个关联数据数组——在本例中,我将使用一个
下面是一个使用映射插入、排序和输出数据的示例
#include<iostream>
#include<map>
#include<vector>
#include<ctime>
struct value {
std::string code;
std::string date;
std::string name;
};
void Print_Range(std::vector<value> & Data, value & Date_Start, value & Date_end)
{
std::map<time_t, value *> Associated_Data;
for(auto Date_Object : Array_Of_Dates)
{
time_t Object_Time = GetDateFromObject(Date_Object);
Associated_Data.insert(std::make_pair(Object_Time, & Date_Object);
}
//as the std::map is sorted by-default,
//we can know locate the iterator for any two time codes
time_t Search_From = GetDateFromObject(Date_Start);
time_t Search_To = GetDateFromObject(Date_End);
auto Start_IT = Associated_Data.find(Search_From);
auto End_IT = Associated_Data.find(Search_To);
std::cout << "Printing all dates in range \n";
for(auto IT=Start_IT; IT != End_IT; IT++)
{
std::cout << IT->Second->date << '\n';
}
}
#包括
#包括
#包括
#包括
结构值{
std::字符串代码;
std::字符串日期;
std::字符串名;
};
无效打印范围(标准::矢量和数据、值和日期开始、值和日期结束)
{
std::地图相关的_数据;
for(自动日期对象:日期数组)
{
时间\对象\时间=GetDateFromObject(日期\对象);
关联的\u数据.insert(std::make\u对(对象\u时间和日期\u对象);
}
//由于默认情况下对std::map进行排序,
//我们可以知道任何两个时间码的迭代器的位置
time\u t Search\u From=GetDateFromObject(日期开始);
时间搜索到=GetDateFromObject(日期结束);
自动启动\u IT=关联的\u数据。查找(从中搜索);
自动结束它=关联的数据。查找(搜索到);
这个问题有两个方面:
如何从字符串表示中获取可排序的日期值
如何对所述值进行有效排序
从日期字符串中查找有效的时间戳
C++使用TimeTyt对象作为一个有效日期数,从设置日期(1970年1月1日UTC)开始,在每种情况下,你可以认为这是一个以秒为单位的整数表示。
接下来,您需要知道如何将数据解析为时间戳:这里有一些非常有用的链接
我更喜欢的方法是——这里有一个例子
你可能想考虑使用,如果日期格式是不寻常的。在这种情况下,使用通常是最简单的方式——这个函数的接口有点旧的“C风格”,但这并不能改变它工作的简单事实。
我在下面写的代码很接近
#包括
#包括
时间\u t GetDateFromObject(值和日期\u对象)
{
char*Date\u String=Date\u Object.Date.c_str();
整数年、月、日、时、分、秒;
如果(sscanf(日期字符串,“%d-%d-%d%d:%d:%d”、&年、月、日、时、分、秒)==6)
{
时间与时间;
时间(&rawTime);
struct tm*parsedTime;
parsedTime=localtime(&rawTime);
//tm_年是自1900年以来的年份
解析时间->tm_year=year-1900;
//tm_月是自一月起的月份
parsedTime->tm_mon=month-1;
解析时间->tm_mday=天;
解析时间->tm_小时=小时;
解析时间->tm_min=分钟;
解析时间->tm_秒=秒;
返回mktime(parsedTime);
}
}
日期的关联和排序
一旦您知道如何从日期获取时间,您就可以开始创建一个关联数据数组——在本例中,我将使用一个
下面是一个使用映射插入、排序和输出数据的示例
#include<iostream>
#include<map>
#include<vector>
#include<ctime>
struct value {
std::string code;
std::string date;
std::string name;
};
void Print_Range(std::vector<value> & Data, value & Date_Start, value & Date_end)
{
std::map<time_t, value *> Associated_Data;
for(auto Date_Object : Array_Of_Dates)
{
time_t Object_Time = GetDateFromObject(Date_Object);
Associated_Data.insert(std::make_pair(Object_Time, & Date_Object);
}
//as the std::map is sorted by-default,
//we can know locate the iterator for any two time codes
time_t Search_From = GetDateFromObject(Date_Start);
time_t Search_To = GetDateFromObject(Date_End);
auto Start_IT = Associated_Data.find(Search_From);
auto End_IT = Associated_Data.find(Search_To);
std::cout << "Printing all dates in range \n";
for(auto IT=Start_IT; IT != End_IT; IT++)
{
std::cout << IT->Second->date << '\n';
}
}
#包括
#包括
#包括
#包括
结构值{
std::字符串代码;
std::字符串日期;
std::字符串名;
};
无效打印范围(标准::矢量和数据、值和日期开始、值和日期结束)
{
std::地图相关的_数据;
for(自动日期对象:日期数组)
{
时间\对象\时间=GetDateFromObject(日期\对象);
关联的\u数据.insert(std::make\u对(对象\u时间和日期\u对象);
}
#include<iostream>
#include<map>
#include<vector>
#include<ctime>
struct value {
std::string code;
std::string date;
std::string name;
};
void Print_Range(std::vector<value> & Data, value & Date_Start, value & Date_end)
{
std::map<time_t, value *> Associated_Data;
for(auto Date_Object : Array_Of_Dates)
{
time_t Object_Time = GetDateFromObject(Date_Object);
Associated_Data.insert(std::make_pair(Object_Time, & Date_Object);
}
//as the std::map is sorted by-default,
//we can know locate the iterator for any two time codes
time_t Search_From = GetDateFromObject(Date_Start);
time_t Search_To = GetDateFromObject(Date_End);
auto Start_IT = Associated_Data.find(Search_From);
auto End_IT = Associated_Data.find(Search_To);
std::cout << "Printing all dates in range \n";
for(auto IT=Start_IT; IT != End_IT; IT++)
{
std::cout << IT->Second->date << '\n';
}
}
std::vector<value> get_between(const std::vector<value>& v,
const std::string& from, const std::string& to)
{
std::vector<value> u;
std::copy_if(v.begin(), v.end(), std::inserter(u, u.begin()),
[from,to](const auto& val) {
return val.date >= from && val.date <= to;
});
return u;
}
std::vector<value> get_between(const std::vector<value>& v,
const std::string& from, const std::string& to)
{
value fromv { "", from, "" };
auto begin = std::lower_bound(v.begin(), v.end(), fromv,
[](const auto& lhs, const auto& rhs) {
return lhs.date < rhs.date;
});
value tov { "", to, "" };
auto end = std::upper_bound(begin, v.end(), tov,
[](const auto& lhs, const auto& rhs) {
return lhs.date < rhs.date;
});
return std::vector<value>(begin, end);
}