现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

C、C++时间与日期函数

2015-05-14 07:17 工业·编程 ⁄ 共 1950字 ⁄ 字号 暂无评论
  • 由于自己实际工作学习中没怎么用时间和日期的函数,在看Unix环境高级编程6.10节和Python的time模块时,总感觉这些东西总是连不成串。

还是从C开始理一理吧。翻翻C标准(C++中的东西我看不懂),相关的也就是time.h这个东西了。

NULL CLOCKS_PER_SEC

类型

size_t clock_t time_t

结构体

tm

函数

asctime clock difftime localtime strftime
ctime gmtime mktime time


走马观花

暂时抛开和clock相关的东西。只看字面上和time直接相关的东西。


获取时间

如何从操作系统获取时间呢?

time_t time(time_t *t);

该函数返回从某个时间点(epoch)到现在为止所经过的秒数。(这个数称为日历时间) 比如:

1319206097

  • (一般情况下这个时间点都是公元1970年1月1日0时,但是微软的C/C++编译器版本7中用的却是1899年12月31日0时,注意,编译器的版本不是MVSC的版本,比如MSVC2010也叫VC9,但对应的编译器版本是16)

这个数字对人来说可真不友好。比如上面这个对应的具体日期是什么,如果不是我写的我还真不知道

转成字符串

char *ctime(const time_t *timep);

我们知道,同一时刻各个时区的时间是不同的。这个函数会考虑当前的时区(通过环境变量TZ)

Fri Oct 21 22:08:17 2011\n\0

这下好看多了,但还是很不够...

分解时间,结构体 tm

我们可以将日历时间,转成包含时分秒等信息的结构体。这样处理起来就方面多了。

struct tm *gmtime(const time_t *timep);
struct tm *localtime(const time_t *timep);

  • 注意:返回的tm结构体的指针,指向的是其内部的一个静态tm结构体变量。

gmtime

格林威治时间

localtime

本地时间(东8区)

 

17

17

8

8

14

22

21

21

21日

9

9

10月(从0开始算)

111

111

2011年(从1900开始)

5

5

周五

293

293

一年中的第293天

0

0

不是夏时制

要从分解时间转换会日历时间,则使用

time_t mktime(struct tm *tm);

转成字符串2

前面的ctime可以从日历时间转成字符串,那么从分解时间如何转成字符串呢?

char *asctime(const struct tm *tm);

比如:前面的gmtime和localtime得到的分解时间,分别对应

Fri Oct 21 14:24:34 2011
Fri Oct 21 22:24:34 2011

不过这个东西太死板了吧,想自定义字符串怎么办?

size_t strftime(char *s, size_t max, const char *format,
                const struct tm *tm);

和printf类似,有一大堆转换符可用,这样一来,我们可以得到

Fri
Friday
2011-10-21
10:24:34 PM
...

类型

简单罗列一下:

time_t

一个整数类型,但具体的范围和精度是由编译器实现所定义的。

struct tm

结构体tm 表示 分解时间(broken-down time)

struct tm {      

 

     int tm_sec; 

 

     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;

/* 星期X: [0 - 6] */

     int tm_yday;

/* 一年中第X天: [0 - 365] */

     int tm_isdst;

/* 夏时制标记: <0, 0, >0 */

};               

 

夏时值,即:日光节约时制(Daylight Saving Time)

clock_t

clock_t clock(void);

返回程序自开始执行到目前为止所占用的处理机时间。如果处理机时间不可使用,那么返回-1。clock()/CLOCKS_PER_SEC是以秒为单位表示的时间。

其他

Unix

在Unix下,与time()相比,

int gettimeofday(struct timeval *tv, struct timezone *tz);

可以获得更高的分辨率(最高为微秒)。

QThread::sleep()在unix下的实现使用该函数。

python的time模块中的time()/sleep()也使用该函数。

locale

函数strftime()生成的字符串受locale中的LC_TIME影响

作者:dbzhang800

给我留言

留言无头像?