如何用C ++处理时间

时间:2019-04-01 04:52:16

标签: c++

我对在c ++中管理日期和时间有疑问。我的程序中有Plane和Flight两个类。

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

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”格式输入{@ 1H}:MM的值,例如:"2019/04/15 10:30" and "2019/04/16 9:30"(我将使用24小时制,时间将是格林尼治标准时间(GMT)。

我的问题是如何将上面的两个字符串转换为适当的格式以存储在我的planeSchedule中,这样我就可以避免在planeSchedule中发生时间冲突。

例如,如果下次我添加一个航班,其出发日期和到达日期介于2019/04/15 10:30" and "2019/04/16 9:30"之间,例如:"2019/04/15 13:30" and "2019/04/16 7:30",我将收到类似“飞行冲突,飞机是无法飞行。”

我的教授建议使用无符号的long int来存储时间,但是我真的不知道从哪里开始解决这个问题。任何帮助/建议表示赞赏。

2 个答案:

答案 0 :(得分:5)

在C ++中有关日期和时间的最佳位置是<chrono>。自C ++ 11起,其中一些便已存在,而C ++ 20会附带其中一些。它可以与<ctime>中的C风格的日期和时间实用程序结合使用,甚至可以满足您的目的。

尝试将日期/时间处理为整数或字符串,将其从输入中解析,比较,然后将其转换为字符串以输出,将有效地导致您重新实现这些标头中已有的部分(又称为“重新发明轮子”) )。

答案 1 :(得分:5)

基于对系统做得不好的长期经验,我有两条建议:-)

首先是将日期和时间信息存储为字符串或整数值,尤其是当C ++在std::chrono中对此有很好的支持时。如果使用正确的类型,则比较和操作将变得相对简单。

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


通过示例,这是一个完整的程序,其中显示了操作中的简单性(a)

#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";
}

该程序的输出为:

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

(a)是的,该程序可能似乎很大,但这仅仅是因为它使它成为一个完整的程序。 getTimePointoutputTime函数说明了如何在时间点之间进行转换,而 meat 的简单之处在于包含duration_cast的行以获取两个时间点之间的分钟数。