【问题标题】:Is there a standard date/time class in C++?C++ 中有标准的日期/时间类吗?
【发布时间】:2010-12-11 15:57:34
【问题描述】:

C++ stl 有标准时间等级吗?或者我是否必须在写入流之前转换为 c 字符串。例如,我想将当前日期/时间输出到字符串流:

time_t tm(); ostringstream 南; sout

在这种情况下,我将当前日期/时间写成没有任何格式的数字。我可以用 c-运行时函数strftime首先格式化tm,但如果stl有一个可以从time_t值实例化的时间类,这似乎不是必需的

【问题讨论】:

标签: c++ datetime stl stream


【解决方案1】:

还有一个ctime(&time_t) 方法输出字符串(char*)。

【讨论】:

  • 除非您需要完全该日期/时间格式,否则这并不完全有帮助。不过,看着它只会让我颤抖;我想我永远不想在应用程序中看到它。
【解决方案2】:

不是 STL 的一部分,但众所周知的库是 boost。

我会选择使用boost::date。以下是一些示例:http://www.boost.org/doc/libs/1_55_0/doc/html/date_time/date_time_io.html#date_time.io_tutorial

如果您还没有尝试过 boost,我鼓励您这样做,因为它可以让您避免很多讨厌的问题,因为它掩盖了大多数操作系统相关的东西,例如线程。 boost 中的许多东西只是标题(模板库)。但是 datetime 需要一个 lib 或 dll。

【讨论】:

    【解决方案3】:

    编辑

    自 C++11 起,标准的“日期时间”类为 std::chrono::time_point。问题中的代码应该大致相当于

    const auto now = std::chrono::system_clock::now();
    const auto t_c = std::chrono::system_clock::to_time_t(now);
    std::cout << std::put_time(std::localtime(&t_c), "%F %T.\n");
    

    老答案

    吹毛求疵:作为标准模板库的 STL 处理通用容器和算法等,即使在未来也不太可能合并用于日期处理和计算的类……

    C++ 标准库本身包括 STL 和 C 标准库的早期版本。后者通过#include &lt;ctime&gt;提供了一些与日期和时间相关的功能,上面已经提到了。

    如果包装(或简单地使用)这些功能比拉入boost 足够(并且更快),请使用这些功能。他们没有任何问题。

    【讨论】:

    • 这个答案不成熟..
    • @WBuck 嗯,是的...这
    【解决方案4】:

    好的。这是我发现的最接近直接将时间写入流的方法:

    time_t t(time(NULL));   // current time
    tm tm(*localtime(&t));  
    
    std::locale loc("");    // current user locale
    ostringstream sout;
    const std::time_put<TCHAR> &tput =
        std::use_facet<std::time_put<TCHAR> >(loc);
    tput.put(sout.rdbuf(), sout, _T('\0'), &tm, _T('x'));
    sout << ends;
    
    CString sTest(sout.str().c_str());
    

    一个非常有用的指南是 Apache C++ 标准库参考指南 http://stdcxx.apache.org/doc/stdlibref/time-put.html#sec13

    【讨论】:

      【解决方案5】:

      标头中有 get_timeput_time(我猜这些是 C++11 附带的),它们可以有效地进行字符串格式化或解析工作。

      【讨论】:

        【解决方案6】:

        C++ 现在有日期和时间的 chrono 库。 这记录在 http://en.cppreference.com/w/cpp/chronohttp://www.cplusplus.com/reference/chrono/

        【讨论】:

          【解决方案7】:

          嗯,这个问题被问到已经有十几年了。现在(在 C++20 中)它终于有了更好的答案。

          是的,C++20 中有几个标准的日期/时间类(不仅仅是一个)。在强类型系统中,每个都有不同的用途。例如std::chrono::zoned_time 表示std::chrono::time_zonestd::chrono::time_point&lt;system_clock, SomeDuration&gt; 的配对,并表示某个地理区域的当地时间。以下是您可以如何创建和打印当前时区的本地时间,以达到您的操作系统允许的最精细的亚秒级精度。

          cout << zoned_time{current_zone(), system_clock::now()} << '\n';
          

          如果您需要其他地方的当地时间,那也很容易获得:

          cout << zoned_time{"Africa/Casablanca", system_clock::now()} << '\n';
          

          与以前的 C++ 标准不同,基于system_clocktime_points 现在保证代表UTC,忽略闰秒(又名Unix Time)。因此,要获得 UTC 中的当前时间,只需:

          cout << system_clock::now() << '\n';
          

          虽然如果您真的想使用 zoned_time 代替(例如代码可能是通用的),这也可以:

          cout << zoned_time{"UTC", system_clock::now()} << '\n';
          

          查看https://en.cppreference.com/w/cpp/chrono 了解更多标准日期/时间类。它们都是线程安全的。而且您不再局限于秒精度。

          【讨论】:

            猜你喜欢
            • 2011-11-28
            • 2018-03-16
            • 2018-06-19
            • 2011-08-21
            • 1970-01-01
            • 2018-12-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多