28

假设我有 time_t 和 tm 结构。我不能使用 Boost 但 MFC。我怎样才能使它像下面这样的字符串?

Mon Apr 23 17:48:14 2012

使用 sprintf 是唯一的方法吗?

4

6 回答 6

51

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++03time_put在语言环境中有一个方面可以做同样的事情。如果没记错的话,我确实设法让它工作了一次,但在那之后觉得这不值得麻烦,从那以后我就再也没有做过了。

于 2012-04-23T22:16:23.070 回答
16

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

于 2012-04-23T22:14:04.173 回答
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/inittailizing-mfccrt-for-consumption-of-regional-settings-internationalizationc

于 2012-12-31T19:51:39.347 回答
2

ctime()生成该格式的字符串。它需要一个指向 a 的指针time_t
还有asctime()一个指针指向 astruct tm并做同样的事情。

于 2012-04-23T22:31:45.680 回答
1
CTime obj1(time_tObj);

CString s = obj1.Format( "%a %b %d %H:%M:%S %Y" );
于 2012-04-24T02:46:23.503 回答
1

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

于 2012-04-23T22:17:36.640 回答