C++ 中有标准的日期/时间类吗?

Posted

技术标签:

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

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

time_t tm(); ostringstream 南; sout

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

【问题讨论】:

现在有一个完整的现代 C++ 日期/时间/时区提案提交给委员会:open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0355r1.html。此提案基于此 github 存储库:github.com/HowardHinnant/date,它具有完整的实现、完整的文档和活跃的用户社区。​​span> 上面评论中提到的库现在是 C++20 规范草案的一部分。 【参考方案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_time 和 put_time(我猜这些是 C++11 附带的),它们可以有效地进行字符串格式化或解析工作。

【讨论】:

【参考方案6】:

C++ 现在有日期和时间的 chrono 库。 这记录在 http://en.cppreference.com/w/cpp/chrono 和 http://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_timecurrent_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 了解更多标准日期/时间类。它们都是线程安全的。而且您不再局限于秒精度。

【讨论】:

以上是关于C++ 中有标准的日期/时间类吗?的主要内容,如果未能解决你的问题,请参考以下文章

Java时间,如何确定最后的日期

C++ 标准库必须支持那些挑剔朋友是谁的类吗?

C++时间和日期

c++ 当前时间和日期获取

你能在 C++ 中保护嵌套类吗?

您可以在 C++ 中动态分配带有向量作为字段的类吗?