我正在尝试为我的程序创建时间戳。在我姐姐的Mac上(使用Xcode 4.2),这段代码非常合适:
struct tm * timeInfo;
time_t rawtime;
time (&rawtime);
timeInfo = localtime (&rawtime);
string timestamp(asctime(timeInfo));
但是,在运行Visual Studio 2012的PC上,我收到localtime和asctime的错误,告诉我它们是不安全的函数,它建议使用localtime_s和asctime_s。但是,功能参数不同。我尽力研究这些功能,但我无法让它发挥作用。
非常感谢任何有助于实现这一目标的帮助。
编辑:
struct tm * timeInfo;
time_t rawtime;
time (&rawtime);
timeInfo = localtime_s (&rawtime);
string timestamp(asctime_s(timeInfo));
答案 0 :(得分:4)
这些功能具有不同参数的原因是缺少安全性是由于只有一个参数。特别是,asctime()
使用单个缓冲区来返回时间。所以,如果你做了类似的事情:
char *s1 = asctime((time_t)0); // 1-Jan-1970 00:00:00 or something like that.
time_t t = time();
char *s2 = asctime(t);
cout << "1970: " << s1 << " now:" << s2 << endl;
然后您将看不到打印两个不同的时间,但当前时间打印两次,因为s1
和s2
都指向相同的字符串。
同样适用于localtime
,它返回指向struct tm
的指针 - 但它总是相同struct tm
,所以如果你这样做:
struct tm* t1 = localtime(0);
struct tm* t2 = localtime(time());
您将在t1
和t2
中获得相同的值(“当前”时间,而非1970年)。
因此,要解决此问题,asctime_s
和localtime_s
会有一个额外的参数用于存储数据。 asctime_s
还有第二个额外参数来告诉函数存储缓冲区中有多少空间,否则,它可能会溢出该缓冲区。