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.
小智 6
C++ 现在有日期和时间的 chrono 库。这记录在http://en.cppreference.com/w/cpp/chrono和http://www.cplusplus.com/reference/chrono/
好吧,距离这个问题被问到已经有十几年了。现在(在 C++20 中)终于有了更好的答案。
是的,C++20 中有多个标准日期/时间类(不仅仅是一个)。每个在强类型系统中都有不同的用途。例如,表示 a和 astd::chrono::zoned_time
的配对,并表示某个地理区域的当地时间。以下是您如何创建并打印当前时区的本地时间(达到操作系统允许的最精细的亚秒精度)。std::chrono::time_zone
std::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)
B. 如果您想要昨天与现在当地时间相同的日期/时间,则对上述代码进行非常细微的调整:
auto timeYesterday = current_zone()->to_local(timeNow) - 24h;
Run Code Online (Sandbox Code Playgroud)
如前所述,这两种算法几乎总是给出相同的结果。但每隔一段时间,对于某些时区,他们可能会给出不同的答案。因此,了解您想要什么并能够灵活地轻松编程您想要的内容是件好事。并让代码在其他程序员阅读时反映您的决定。
最后,除了减去24h
,还可以使用days{1}
或86'400s
,或任何其他指示所需时间流逝的单位。唯一的区别是可读性。