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

问题描述 投票:0回答:8

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

time_t tm();
南弦流;
南<< tm << ends;

在这种情况下,我将当前日期/时间写为数字,没有任何格式。我可以用 c-运行时函数

strftime
首先格式化tm,但是如果stl有一个可以从time_t值实例化的时间类,那么似乎就没有必要了

c++ datetime stl stream
8个回答
24
投票

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。


19
投票

编辑

自 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 足够(并且更快),请使用这些函数。他们没有任何问题。


8
投票

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


6
投票

标头中有 get_timeput_time(我猜这些是 C++11 附带的),它们可以有效地执行字符串格式化或解析工作。


4
投票

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


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


4
投票

嗯,这个问题已经问了十几年了。现在(在 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

了解更多标准日期/时间类。它们都是线程安全的。而且您不再局限于秒精度。


0
投票

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());

如果对代表 Unix 时间并包装“ctime”函数的此类“cTime”感兴趣,请参阅
https://github.com/OlafSimon/cTime
。是的,您可以从“time_t”变量实例化,例如命名为“myTimeT”。

cTime myTime = cTime::set(myTimeT);


© www.soinside.com 2019 - 2024. All rights reserved.