【问题标题】:How to deal with time in C++如何在 C++ 中处理时间
【发布时间】:2019-04-01 04:52:16
【问题描述】:

我有一个关于在 C++ 中管理日期和时间的问题。我的程序中有两个班飞机和飞行。

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

string tailNumber;//Plane's unique trait
vector<vector<string>> planeSchedule;//2D string vector to contain plane's depature date and arrival date

我的 Flight 类将包含以下数据:

string tailNumber;//Plane's unique trait
string departureDate;
string arrivalDate;

在我的主课中,我将输入离开日期和到达日期的值,格式为:“YYYY/MM/DD HH: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",我将收到类似“航班冲突,飞机无法搭乘航班”的错误。”

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

【问题讨论】:

标签: c++


【解决方案1】:

C++ 中有关日期和时间的首选位置是&lt;chrono&gt;。其中一些自 C++11 以来一直存在,其中一些我们将在 C++20 中看到。它与 &lt;ctime&gt; 中的 C 风格日期和时间实用程序结合使用,这甚至可能足以满足您的目的。

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

【讨论】:

  • 我很惊讶教授们居然推荐了一些陈腐的东西,比如“使用无符号长整数来存储时间”,就好像这是 1970 年……难怪人们离开这些课程时认为“C++ 很复杂” ",当它真的不是。
  • 这是 C++20 &lt;chrono&gt; 位的工作预览:github.com/HowardHinnant/date 它位于命名空间 date 而不是 namespace std::chrono
【解决方案2】:

根据对系统性能不佳的长期经验,我有两条建议 :-)

第一个是将日期和时间信息存储为字符串或整数值,尤其是当 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 的行来获取两者之间的分钟数时间点。

【讨论】:

  • 你能给我一些使用 std::chrono 来解决我的问题的说明吗?任何事情都值得赞赏。
  • @DatTo:如果您可以将“您的问题”简化为一个功能,那会更容易。就目前而言,“你的问题”是从解析输入到存储值再到一些不太明确的输出比较。即,“为我编写我的程序”,这通常不是在 Stackoverflow 上完成的。选择一些具体的东西,我相信我们可以向您展示一些示例代码。
猜你喜欢
  • 1970-01-01
  • 2011-09-16
  • 2012-04-05
  • 2010-11-27
  • 1970-01-01
  • 2020-04-22
  • 2021-03-09
  • 1970-01-01
  • 2020-12-14
相关资源
最近更新 更多