玩技术,Geeker
一个原创技术文章分享网站

Linux C语言时间操作总结

总是搞不清

写代码的过程中,经常要使用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日 于呼和浩特。

未经允许不得转载:果冻想 » Linux C语言时间操作总结

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

在这里玩技术,享受技术带来的疯狂

捐赠名单关于果冻