写代码的过程中,经常要使用C标准库中的一些函数,比如时间相关的函数,每次使用都要去查文档,虽然经常用,但是也没有总结过,以至于每次使用时,还是没有办法一次搞定,为了搞定这个时间操作的问题,就总结了这么一篇文章,就是一个总结,以后再写时间操作相关的代码时,不查文档,一次搞定。
现在工作的环境都是Linux,对于时间操作,也就是使用C标准库中的几个函数,如下所示:
这些函数对应的头文件是<ctime>
和 <time.h>
。这些函数都存在一定的联系的,如下图所示:
我一般怎么用这几个函数呢?首先调用time
函数获得一个当前时间距离UTC时间1970年1月1日的秒数,这个函数返回一个time_t
类型的值,说白了就是一个整型值;得到这个值以后,我们就可以进行接下来的任何操作了。
ctime
函数就可以直接搞定;ctime
函数会返回例如下述格式的一个字符串:
Wed Feb 13 16:06:10 2013
localtime
或者gmtime
函数就可以搞定了(localtime
返回本地时间信息;gmtime
返回UTC时间信息),localtime
或者gmtime
函数返回一个struct tm
类型的结构体,你要的字段信息都在里面,去看看吧。snprintf
一样,非常强大。关于%d
、%s
…这些东西,就看文档去吧。看个简单的代码示例吧,最感性的还是代码。
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
time_t rawTime;
rawTime = time(NULL);
if (rawTime == -1)
{
return 0;
}
cout<<"Now is:"<<ctime(&rawTime)<<endl;
struct tm *timeInfo;
timeInfo = localtime(&rawTime);
cout<<"Now is:"<<asctime(timeInfo)<<endl;
cout<<"Year:"<<timeInfo->tm_year + 1900<<endl;
cout<<"Month:"<<timeInfo->tm_mon + 1<<endl;
cout<<"Day:"<<timeInfo->tm_mday<<endl;
char buff[256] = {0};
strftime(buff, sizeof(buff) / sizeof(buff[0]), "今天是%Y年%m月%d日", timeInfo);
cout<<buff<<endl;
return 0;
}
例子太简单了,不想分析。
从文档中可以看到以下函数的声明:
上述四个函数都是返回一个指针类型的值,那么问题来了,这个指针指向的是哪块内存呢?
首先需要确定的是,这几个函数返回的指针指向的内存不是我们开辟或定义的。库自己开辟的?是的,没错,库自己搞了一块内存。然后文档中也详细的说了,调用这四个函数不是线程安全的,明白了么?你刚刚得到的struct tm
值,可能在另一个线程中被别人修改了。所以,使用之前,想清楚喽!!!
这些小的知识点在日常开发工作中经常会使用到,也是留意最少的地方,而也是这些小地方容易出现问题,不积跬步无以至千里,只有积累多了,当真的出现问题时,也能从容应对。
2015年6月5日 于呼和浩特。