C++ stl 有标准时间类吗?或者我是否必须在写入流之前转换为 c 字符串。例如,我想将当前日期/时间输出到字符串流:
time_t tm(); 南弦流; 南<< tm << ends;
在这种情况下,我将当前日期/时间写为数字,没有任何格式。我可以用 c-运行时函数
strftime
首先格式化tm,但是如果stl有一个可以从time_t值实例化的时间类,那么似乎就没有必要了
boost 不是 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
中的许多内容仅是标头(模板库)。但是日期时间需要 lib 或 dll。
编辑
自 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 足够(并且更快),请使用这些函数。他们没有任何问题。
C++ 现在拥有用于日期和时间的 chrono 库。 这记录在 http://en.cppreference.com/w/cpp/chrono 和 http://www.cplusplus.com/reference/chrono/
还有一个 ctime(&time_t) 方法,它输出字符串 (char*)。
好的。这是我发现的最接近直接将时间写入流的方法:
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
嗯,这个问题已经问了十几年了。现在(在 C++20 中)终于有了更好的答案。
是的,C++20 中有多个标准日期/时间类(不仅仅是一个)。每个在强类型系统中都有不同的用途。例如,
std::chrono::zoned_time
表示std::chrono::time_zone
和std::chrono::time_point<system_clock, SomeDuration>
的配对,并表示某个地理区域的当地时间。以下是您如何创建并打印当前时区的本地时间(达到操作系统允许的最精细的亚秒精度)。
cout << zoned_time{current_zone(), system_clock::now()} << '\n';
如果您需要其他地方的当地时间,也可以轻松获得:
cout << zoned_time{"Africa/Casablanca", system_clock::now()} << '\n';
与以前的 C++ 标准不同,基于
time_point
的 system_clock
现在“保证”代表 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
using namespace std::literals; // enables literal suffixes, e.g. 24h, 1ms, 1s.
const std::chrono::time_point<std::chrono::system_clock> now =
std::chrono::system_clock::now();
const std::time_t t_c = std::chrono::system_clock::to_time_t(now - 24h);
std::cout << "24 hours ago, the time was "
<< std::put_time(std::localtime(&t_c), "%F %T.\n") << std::flush;
24小时前,时间是2021-02-15 18:28:52。
这是简化时间使用的解决方案吗?我对“mkluwe”表示同情,他说:“如果包装(或简单地使用)这些函数 [ctime] 比拉升压足够(并且更快),那么就使用这些函数。它们没有任何问题。”。是的,但是在哪里可以找到表示时间并包装那些“ctime”函数的 C++ 类呢?我没有成功找到这样的课程。因此我花了一些时间来做这件事,也许现在有人很高兴找到它。该类在命名空间“LibCpp”中被命名为“cTime”。
using namespace LibCpp;
cTime timeNow = cTime::now();
stDuration duration24 = stDuration_Ini;
duration24.hours = 24;
cTime duration = cTime::set(duration24);
cTime timeTomorrow = timeNow + duration;
printf("24 hours ago, the time was %s", timeTomorrow.toString().c_str());
https://github.com/OlafSimon/cTime。是的,您可以从“time_t”变量实例化,例如命名为“myTimeT”。