【问题标题】:C++ convert string date (1/4/2000) to int date (20000104)C++ 将字符串日期 (1/4/2000) 转换为 int 日期 (20000104)
【发布时间】:2013-01-29 10:15:52
【问题描述】:

我可以编写一个函数来解析字符串日期,但我觉得我在这里重新发明了轮子。是否有一种更快的、可能是内置的 C++ 方法来从这种格式的字符串日期:2000 年 1 月 4 日到更易于使用的 int,如 20000104?

【问题讨论】:

  • 最近有人问过similar question
  • 20000104 可能很容易比较或订购,但对于任何算法...

标签: c++ string date data-conversion


【解决方案1】:

除非您还需要内置的 C++ 方法来进行验证,否则“显而易见的”解析是:

int parseDate(const std::string &input) {
    int month;
    int day;
    int year;
    if (std::sscanf(input.c_str(), "%d/%d/%d", &month, &day, &year) != 3) {
        // handle error
    } else {
        // check values to avoid int overflow if you can be bothered
        return 10000 * year + 100 * month + day;
    }
}

如果你想编写几行代码类型安全,你可以使用流提取器而不是sscanf

标准库中肯定没有什么可以为您执行10000 * year + 100 * month + day。如果你不拘泥于那个确切的值,你只想要一个正确顺序的整数,那么你可以看看你的平台是否有一个功能来告诉你所谓的“儒略日”。

【讨论】:

    【解决方案2】:

    标准库函数是strptime(),但不确定它在 C++ 中的“干净”程度。

    如果您对 strptime() 没意见,以下是您将如何使用它来处理您的情况:

    struct tm when;
    
    strptime("1/4/2000", "%m/%d/%y", &tm); // Note: should check return value.
    const int sortable = 10000 * tm.tm_year + 100 * tm.tm_month + tm.tm_day;
    

    当然,您可以根据需要使用 Boost;相关角似乎是Posix Time

    【讨论】:

    • 我不熟悉 strptime(),是否可以提供一个可以处理我的案例的示例,以便我(和其他有类似问题的人)可以看到它是如何工作的?
    • 我认为相关的Boost文档是date_input_facet。 Posix Time 假设输入已经是 ISO 格式,即年份优先。
    • strptime 具有令人兴奋的特性,它在 Posix 中,但在标准 C++(或标准 C)中没有。 C++ 有一个名为 time_get 的语言环境类别,它解析相同的格式,但我从未使用过它,所以我不能轻易地制作一个示例。
    • 此代码不起作用,tm_year 无法正确获取年份。
    猜你喜欢
    • 2011-04-22
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多