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

Far*_*d Z 28 c++ datetime stl stream

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

time_t tm();
ostringstream sout;
sout << tm << ends;

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

jde*_*aan 22

不是STL的一部分,但众所周知的库是提升.

我会采用的方式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.


mkl*_*uwe 13

挑剔:作为标准模板库的STL 处理通用容器和算法等,即使将来也不太可能包含用于日期处理和计算的类......

C++标准库本身包括STL和以前版本的C标准库.后者提供了一些日期和时间相关的功能#include <ctime>,上面已经提到过.

如果包装(或简单地使用)这些功能足够(并且更快)而不是提升,请使用这些功能.他们没有错.


zah*_*hir 6

在<iomanip>标题中有get_timeput_time(我想这些是C++ 11附带的),它可以有效地进行字符串格式化或解析作业.


小智 6

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


How*_*ant 5

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

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

cout << zoned_time{current_zone(), system_clock::now()} << '\n';
Run Code Online (Sandbox Code Playgroud)

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

cout << zoned_time{"Africa/Casablanca", system_clock::now()} << '\n';
Run Code Online (Sandbox Code Playgroud)

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

cout << system_clock::now() << '\n';
Run Code Online (Sandbox Code Playgroud)

不过,如果您确实想使用 azoned_time代替(例如代码可能是通用的),这也可以:

cout << zoned_time{"UTC", system_clock::now()} << '\n';
Run Code Online (Sandbox Code Playgroud)

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

例子:

假设您想打印 24 小时前的当地时间。

首先要确定您的意思是 24 小时,还是您想要昨天与现在相同的时间(根据您当地的时钟)。这两件事几乎总是相同的。但如果您在过去 24 小时内经历过夏令时的进入或结束,情况就会有所不同。

C++20 chrono 可以做到这两点,而且无论哪种方式都非常简单:

答:这是计算现在之前 24 个物理小时的方法:

auto timeNow = system_clock::now();
auto timeYesterday = current_zone()->to_local(timeNow - 24h);
std::cout << "24 hours ago, the local time was " << timeYesterday << '\n';
Run Code Online (Sandbox Code Playgroud)
  • 获取当前时间 UTC。
  • 从当前时间减去 24 小时。
  • 将 UTC 时间转换为您的当地时间。
  • 打印出来。

B. 如果您想要昨天与现在当地时间相同的日期/时间,则对上述代码进行非常细微的调整:

auto timeYesterday = current_zone()->to_local(timeNow) - 24h;
Run Code Online (Sandbox Code Playgroud)
  • 在进行减法之前先转换为当地时间,然后以当地时间(而不是 UTC)进行算术运算。

如前所述,这两种算法几乎总是给出相同的结果。但每隔一段时间,对于某些时区,他们可能会给出不同的答案。因此,了解您想要什么并能够灵活地轻松编程您想要的内容是件好事。并让代码在其他程序员阅读时反映您的决定。

最后,除了减去24h,还可以使用days{1}86'400s,或任何其他指示所需时间流逝的单位。唯一的区别是可读性。


bua*_*bua 4

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