如何在C++中格式化日期和时间字符串

31

假设我有一个time_t和tm结构,但不能使用Boost只能用MFC。如何将其转换为以下格式的字符串?

Mon Apr 23 17:48:14 2012

使用sprintf是唯一的方法吗?


2
Boost.DateTime拥有格式化的I/O工具。 - ildjarn
加上一两句话,那可能就是答案了,@ildjarn - Jasper
2
@Jasper:虽然我使用这个库,但是由于文档太糟糕了,所以我发现很难向其他人推荐它。我刚刚留了一个评论,让OP自己选择是否追求(例如,有很多SO答案完全演示了这一点,比如这个)。 - ildjarn
6个回答

56

C库中包括strftime,专门用于格式化日期/时间。 您所要求的格式似乎对应于以下内容:

char buffer[256];

strftime(buffer, sizeof(buffer), "%a %b %d %H:%M:%S %Y", &your_tm);

我相信std::put_time使用类似的格式字符串,虽然它可以使你不必显式地处理缓冲区。如果你想把输出写入流中,它非常方便,但是要将其转换成字符串,它并没有多少帮助--你需要做类似下面的事情:

std::stringstream buffer;

buffer << std::put_time(&your_tm, "%a %b %d %H:%M:%S %Y");

// now the result is in `buffer.str()`.

std::put_time 是 C++11 新增的特性,但是在 C++03 中也有一个 time_put locale facet 可以实现类似的功能。如果我没记错的话,我曾经成功过一次,但之后决定不值得麻烦,就再没用过了。


2
只是想指出,gcc仍然不支持put_time:/ - Benjamin Gruenbaum
它是在GCC 5上完成的。参考:https://dev59.com/K2Yq5IYBdhLWcg3w2UQU#14137287 - Louis Go

17

我会尝试使用 std::put_time。请参见此链接以获取有关如何使用它的信息。它支持完整的格式字符串等。


6
值得注意的是,此解决方案仅适用于C++11。 - ildjarn
4
仍未实现(gcc 4.8.1)。 - Avio

2
如果您需要担心不同语言环境下的格式问题,请不要忘记使用当前语言环境初始化CRT。这也会影响到COleDateTime。
setlocale(LC_COLLATE,“.OCP”); // sets the sort order

setlocale(LC_MONETARY, “.OCP”); // sets the currency formatting rules

setlocale(LC_NUMERIC, “.OCP”); // sets the formatting of numerals

setlocale(LC_TIME, “.OCP”); // defines the date/time formatting

请查看我的博客文章,其中涉及了MSDN文章和其他来源。 http://gilesey.wordpress.com/2012/12/30/initailizing-mfccrt-for-consumption-of-regional-settings-internationalizationc


该文章讲述如何初始化MFCCRT以便在区域设置国际化环境下使用。

2

ctime() 生成这种格式的字符串。它需要一个指向 time_t 的指针。
还有一个函数叫做 asctime(),它需要一个指向 struct tm 的指针,并且执行相同的操作。


ctime(&curtime),其中time_t curtime; 参考:http://www.tutorialspoint.com/c_standard_library/c_function_ctime.htm - parasrish

1

MFC有COleDateTime,它有一个接受time_t(或__time64_t)的构造函数,并且有一个Format方法。


1
CTime obj1(time_tObj);

CString s = obj1.Format( "%a %b %d %H:%M:%S %Y" );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接