如何处理C++中的时间 我有一个关于C++中日期和时间管理的问题。我有两个班,飞机和飞行

如何处理C++中的时间 我有一个关于C++中日期和时间管理的问题。我有两个班,飞机和飞行,c++,C++,我的飞机将包含以下数据: string tailNumber;//Plane's unique trait vector<vector<string>> planeSchedule;//2D string vector to contain plane's depature date and arrival date string tailNumber;//Plane's unique trait string departureDate; string arrival

我的飞机将包含以下数据:

string tailNumber;//Plane's unique trait
vector<vector<string>> planeSchedule;//2D string vector to contain plane's depature date and arrival date
string tailNumber;//Plane's unique trait
string departureDate;
string arrivalDate;
在我的主课中,我将以YYYY/MM/DD HH:MM格式输入出发日期和到达日期的值,例如:2019/04/15 10:30和2019/04/16 9:30。我将使用24小时格式,时间为GMT

我的问题是如何将上面的两个字符串转换为适当的格式以存储在我的planeSchedule中,从而避免planeSchedule中的时间冲突

例如,如果下次我添加的航班的出发和到达日期介于:2019/04/15 10:30和2019/04/16 9:30之间,例如:2019/04/15 13:30和2019/04/16 7:30,我将得到一个错误,如航班冲突,飞机无法飞行


我的教授建议使用无符号长整型来存储时间,但我真的不知道从哪里开始解决这个问题。欢迎提供任何帮助/建议
尝试将日期/时间处理为整数或字符串,从输入解析它们,比较它们,并将它们转换为字符串以供输出,将有效地使您重新实现这些标题中已经存在的部分内容,也就是重新发明轮子。

我有两条建议,它们是基于长期使用系统的经验得出的:-

第一个是不将日期和时间信息作为字符串或整数值存储,特别是当C++在STD::如果使用正确的类型,比较和操作将变得相对简单

其次,确保您始终使用UTC。您应该在获得本地时间后尽快将其转换为UTC,并在演示时尽可能晚地转换回本地时间。这也将大大简化比较

举个例子,下面是一个完整的程序,它展示了simplicitya的作用:

#include <iostream>
#include <iomanip>
#include <sstream>
#include <chrono>

using std::chrono::system_clock;
using std::chrono::duration_cast;

namespace {
    system_clock::time_point getTimePoint(std::string strTime) {
        std::tm myTm = {};
        std::stringstream ss(strTime.c_str());
        ss >> std::get_time(&myTm, "%Y/%m/%d %H:%M");
        return system_clock::from_time_t(std::mktime(&myTm));
    }


    void outputTime(const char *desc, system_clock::time_point &tp) {
        std::time_t now = system_clock::to_time_t(tp);
        std::cout << desc
            << std::put_time(std::localtime(&now), "%Y-%m-%d %H:%M") << "\n";
    }
}

int main() {
    std::string startTime = "2019/04/15 10:30";
    std::string endTime   = "2019/04/16 09:30";

    auto startTp = getTimePoint(startTime);
    auto endTp = getTimePoint(endTime);

    outputTime("Start time: ", startTp);
    outputTime("  End time: ", endTp);

    auto duration = duration_cast<std::chrono::minutes>(endTp - startTp);
    std::cout << "\nThere are " << duration.count() << " minutes between "
        << startTime << " and " << endTime << "\n";
}

a是的,这个项目可能看起来相当大,但那只是因为它是一个完整的项目。getTimePoint和outputTime函数显示如何与时间点进行转换,简单的核心是包含持续时间的行,以获得两个时间点之间的分钟数。

教授们居然推荐使用未签名的长整型来存储时间,就好像这是1970年一样,这让我大吃一惊。。。难怪人们会从这样的课程中走出来,认为C++是复杂的,而实际上不是。这里是C++ 20位的工作预览:它在命名空间数据而不是命名空间STD::计时时间一般被存储为一个整数,表示单位第二、毫秒、100纳秒等。从那个时代开始。你能给我一些关于使用std::chrono解决我的问题的说明吗?非常感谢。@DatTo:如果你能把你的问题简化为一个单一的功能,那就容易多了。目前,您的问题是从解析输入到存储值,再到一些定义不太明确的比较,再到输出,无所不包。也就是说,为我编写程序,这通常不是在Stackoverflow上完成的。选择一些特定的东西,我相信我们可以向您展示一些示例代码行。
Start time: 2019-04-15 10:30
  End time: 2019-04-16 09:30

There are 1380 minutes between 2019/04/15 10:30 and 2019/04/16 09:30