IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Linux C语言时间操作总结

    果冻想发表于 2015-07-29 13:59:10
    love 0

    总是搞不清

    写代码的过程中,经常要使用C标准库中的一些函数,比如时间相关的函数,每次使用都要去查文档,虽然经常用,但是也没有总结过,以至于每次使用时,还是没有办法一次搞定,为了搞定这个时间操作的问题,就总结了这么一篇文章,就是一个总结,以后再写时间操作相关的代码时,不查文档,一次搞定。

    涉及到的函数

    现在工作的环境都是Linux,对于时间操作,也就是使用C标准库中的几个函数,如下所示:

    • time
    • strftime
    • mktime
    • localtime
    • gmtime
    • difftime
    • ctime
    • asctime
    • clock

    这些函数对应的头文件是<ctime>和 <time.h>。这些函数都存在一定的联系的,如下图所示:

    Linux C时间函数关系图

    我一般怎么用这几个函数呢?首先调用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类型的结构体,你要的字段信息都在里面,去看看吧。
    • 想自定义格式输出日期
      这个非常简单,调用strftime就可以搞定了。就像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;
    }
    

    例子太简单了,不想分析。

    注意事项

    从文档中可以看到以下函数的声明:

    • localtime
    • gmtime
    • ctime
    • asctime

    上述四个函数都是返回一个指针类型的值,那么问题来了,这个指针指向的是哪块内存呢?

    首先需要确定的是,这几个函数返回的指针指向的内存不是我们开辟或定义的。库自己开辟的?是的,没错,库自己搞了一块内存。然后文档中也详细的说了,调用这四个函数不是线程安全的,明白了么?你刚刚得到的struct tm值,可能在另一个线程中被别人修改了。所以,使用之前,想清楚喽!!!

    总结

    这些小的知识点在日常开发工作中经常会使用到,也是留意最少的地方,而也是这些小地方容易出现问题,不积跬步无以至千里,只有积累多了,当真的出现问题时,也能从容应对。

    2015年6月5日 于呼和浩特。



沪ICP备19023445号-2号
友情链接