time_t tm(); ostringstream sout; sout << tm << ends;在这种情况下,我得到的当前日期/时间以数字形式输出,没有任何格式。 我可以使用C运行时函数strftime先格式化tm,但是如果STL具有可以从time_t值实例化的时间类,似乎不应该需要这样做。
time_t tm(); ostringstream sout; sout << tm << ends;在这种情况下,我得到的当前日期/时间以数字形式输出,没有任何格式。 我可以使用C运行时函数strftime先格式化tm,但是如果STL具有可以从time_t值实例化的时间类,似乎不应该需要这样做。
除了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。
编辑
C++11标准中的“datetime”类是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/。
嗯,这个问题已经被问了十二年了。现在(在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++标准不同,基于system_clock
的time_point
现在被保证表示UTC时间,忽略闰秒(也称为Unix Time)。因此,要获取当前的UTC时间,只需:
cout << system_clock::now() << '\n';
尽管如果你真的想使用一个zoned_time
(例如代码可能是通用的),这也可以工作:
cout << zoned_time{"UTC", system_clock::now()} << '\n';
/std:c++latest
。示例: https://gcc.godbolt.org/z/8efx6dqrr - Howard Hinnant好的,这是我找到的关于直接将时间写入流的最接近的内容:
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
还有一个ctime(&time_t)方法,它输出字符串(char*)。
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;
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());
cTime myTime = cTime::set(myTimeT);