例程

其实函数就那么几个,具体方法也不少,以下列出几种:

#include "stdio.h"
#include "sys/time.h" 


char timestr[128]="";
time_t now;


//方法1
// now = time( 0 );
int  main()
{
	//设置时区(不一定有用)
	setenv("TZ", "GMT-8", 1);
    tzset();
    //方法1
    time(&now);
    strftime(timestr, 128, "%a, %d %b %Y %H:%M:%S GMT", localtime(&now));
    printf("strftime(fmt localtime(&now))Date&Time:%s\r\n", timestr);


    //方法2
    struct tm *p;
    now = time( 0 );
    p=gmtime(&now); //无时区信息
    strftime(timestr, 128, "%Y-%m-%d %H:%M:%S", p);
    printf("strftime(fmt gmtime(&now))Date&Time:%s\r\n", timestr);
    printf("p->tm_hour:p->tm_min:p->tm_sec >>> %02d:%02d:%02d\r\n",p->tm_hour,p->tm_min,p->tm_sec);
    //方法3
    struct tm timeinfo;
    time_t t = time( 0 );
    timeinfo = *localtime(&now);
    printf("Date&Time:%04d-%02d-%02d,%02d:%02d:%02d",1900+(timeinfo.tm_year), (timeinfo.tm_mon)+1,timeinfo.tm_mday, timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);

    //方法4
    struct timeval tv_now;
    gettimeofday(&tv_now, NULL);
    localtime_r(&tv_now.tv_sec, &timeinfo);
    printf("Date&Time:%04d-%02d-%02d,%02d:%02d:%02d",1900+(timeinfo.tm_year), (timeinfo.tm_mon)+1,timeinfo.tm_mday, timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);

	//如果需要时区转换,那么
	uint16_t offset = 28800; //8*60*60 即8小时对应的秒数
	time_t localtimestamp = now + offset;

}

struct timeval结构体

struct timeval结构体在time.h中的定义为:

struct timespec {
    time_t tv_sec;                   /* Seconds */
    long   tv_nsec;                  /* Nanoseconds */
};

其中,tv_sec为Epoch到创建struct timeval时的秒数,tv_usec为微秒数。

strftime()函数

获取日期不同格式的最快方法是使用strftime()函数
它根据 format 中定义的格式化规则,格式化结构 timeptr 表示的时间,并把它存储在 str 中。

声明

下面是 strftime() 函数的声明。

size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)

参数

  • str – 这是指向目标数组的指针,用来复制产生的 C 字符串。
  • maxsize – 这是被复制到 str 的最大字符数。
  • format – 这是 C 字符串,包含了普通字符和特殊格式说明符的任何组合。这些格式说明符由函数替换为表示 tm 中所指定时间的相对应值。格式说明符是:

说明符

替换为

实例

%a

缩写的星期几名称

Sun

%A

完整的星期几名称

Sunday

%b

缩写的月份名称

Mar

%B

完整的月份名称

March

%c

日期和时间表示法

Sun Aug 19 02:56:02 2012

%d

一月中的第几天(01-31)

19

%H

24 小时格式的小时(00-23)

14

%I

12 小时格式的小时(01-12)

05

%j

一年中的第几天(001-366)

231

%m

十进制数表示的月份(01-12)

08

%M

分(00-59)

55

%p

AM 或 PM 名称

PM

%S

秒(00-61)

02

%U

一年中的第几周,以第一个星期日作为第一周的第一天(00-53)

33

%w

十进制数表示的星期几,星期日表示为 0(0-6)

4

%W

一年中的第几周,以第一个星期一作为第一周的第一天(00-53)

34

%x

日期表示法

08/19/12

%X

时间表示法

02:50:06

%y

年份,最后两个数字(00-99)

01

%Y

年份

2012

%Z

时区的名称或缩写

CDT

%%

一个 % 符号

%

  • timeptr – 这是指向 tm 结构的指针,该结构包含了一个被分解为以下各部分的日历时间(如上文例程中的struct tm timeinfo):
struct tm {
   int tm_sec;         /* 秒,范围从 0 到 59                */
   int tm_min;         /* 分,范围从 0 到 59                */
   int tm_hour;        /* 小时,范围从 0 到 23                */
   int tm_mday;        /* 一月中的第几天,范围从 1 到 31                    */
   int tm_mon;         /* 月份,范围从 0 到 11                */
   int tm_year;        /* 自 1900 起的年数                */
   int tm_wday;        /* 一周中的第几天,范围从 0 到 6                */
   int tm_yday;        /* 一年中的第几天,范围从 0 到 365                    */
   int tm_isdst;       /* 夏令时                        */    
};

注:
如要使用struct timeval 结构体 ,那么需要包含sys/time.h 文件而非time.h