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 <ctime>
提供了一些与日期和时间相关的功能,上面已经提到了。
如果包装(或简单地使用)这些功能比拉入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】:【讨论】:
【参考方案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_zone
和std::chrono::time_point<system_clock, SomeDuration>
的配对,并表示某个地理区域的当地时间。以下是您可以如何创建和打印当前时区的本地时间,以达到您的操作系统允许的最精细的亚秒级精度。
cout << zoned_timecurrent_zone(), system_clock::now() << '\n';
如果您需要其他地方的当地时间,那也很容易获得:
cout << zoned_time"Africa/Casablanca", system_clock::now() << '\n';
与以前的 C++ 标准不同,基于system_clock
的time_point
s 现在保证代表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++ 中有标准的日期/时间类吗?的主要内容,如果未能解决你的问题,请参考以下文章