Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;获取两个日期之间的日期_C++_Sorting_Date Range - Fatal编程技术网

C++ C++;获取两个日期之间的日期

C++ 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值(日期和时间的数字表示),然后迭代向量,并在三个时间数之间使

我把每个日期都放在一个向量struct
(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);
    }