C++时间
2017-01-12 23:52
113 查看
概念
UTC和GMT
Coordinated Universal Time(UTC):协调世界时,又称为世界标准时间,也就是大家所熟知的格林威治标准时间(Greenwich Mean Time,GMT)。比如,中国内地的时间与UTC的时差为+8,也就是UTC+8。美国是UTC-5。Calendar
Calendar Time:日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来说,这个标准时间点是不变的,该编译系统中的时间对应的日历时间都通过该标准时间点来衡量,所以可以说日历时间是“相对时间”,但是无论你在哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的。Epoch
据基准起始时间1970年1月1日 UTC(世界标准时间) 0点的秒数UBuntu下用date +%s 可以显示当前时间的秒数。date -d @秒数 可以将 秒数字 转换成 对应的时间clock tick
clock tick:时钟计时单元(而不把它叫做时钟滴答次数),一个clock tick不是CPU的一个时钟周期,而是C/C++的一个基本计时单位。Second family
millisecond 毫秒 ms 1e-3秒microsecond 微秒 μs 1e-6秒nanosecond 纳秒 ns 1e-9秒picosecond 皮秒 ps 1e-12秒常用C类型
__time_t和__suseconds_t
我们可以使用ANSI标准库中的time.h头文件,。这个头文件中定义的时间和日期所使用的方法,无论是在结构定义,还是命名,都具有明显的C语言风格。下面,我将说明在C/C++中怎样使用日期的时间功能。估计是因为GCC采用C++代码实现C,所以现在跟踪下来的类型定义居然是__STD_TYPE前缀。__STD_TYPE __TIME_T_TYPE __time_t; /* Seconds since the Epoch. */而__TIME_T_TYPE宏定义如下:
#define __TIME_T_TYPE __SLONGWORD_TYPE__SLONGWORD_TYPE宏定义如下:
#define __SLONGWORD_TYPE long int同样,__suseconds_t类型也是long int.在Linux 64bit和GCC4.6.1环境下,long int是64位的。对__time_t数据类型的值来说,它所表示的时间不能晚于3001年1月1日0时0分0秒。
timeval结构
使用timeval结构需要添加宏#define __need_timeval 1和<time.h>文件一起使用或者引入<sys/time.h>文件。[cpp] viewplain copy#ifdef __need_timeval # undef __need_timeval # ifndef _STRUCT_TIMEVAL # define _STRUCT_TIMEVAL 1 # include <bits/types.h> /* A time value that is accurate to the nearest microsecond but also has a range of years. */ struct timeval { __time_t tv_sec; /* Seconds. */ __suseconds_t tv_usec; /* Microseconds. */ }; # endif /* struct timeval */ #endif /* need timeval */ 基准计算时间为1970年1月1日 UTC(世界标准时间) 0点(Epoch)用time_t表示的时间(日历时间)是从一个时间点(例如:1970年1月1日0时0分0秒)到此时的秒数。在time.h中,我们也可以看到time_t是一个长整型数:下面的代码演示了如何获取当前系统时间并转换成字符串:timeval tv;gettimeofday(&tv,NULL);std::cout<<ctime(&tv.tv_sec)<<endl;//将秒数转换成当前时间的字符串表示tm结构
tm数据结构保存了日期和时间的各个字段[cpp] viewplain copy#ifdef _TIME_H __BEGIN_NAMESPACE_STD /* Used by other time functions. */ struct tm { int tm_sec; /* Seconds. [0-60] (1 leap second) */ int tm_min; /* Minutes. [0-59] */ int tm_hour; /* Hours. [0-23] */ int tm_mday; /* Day. [1-31] */ int tm_mon; /* Month. [0-11] */ int tm_year; /* Year - 1900. */ int tm_wday; /* Day of week. [0-6] */ int tm_yday; /* Days in year.[0-365] */ int tm_isdst; /* DST. [-1/0/1]*/ #ifdef __USE_BSD long int tm_gmtoff; /* Seconds east of UTC. */ __const char *tm_zone; /* Timezone abbreviation. */ #else long int __tm_gmtoff; /* Seconds east of UTC. */ __const char *__tm_zone; /* Timezone abbreviation. */ #endif };相关C函数
time_t相关
time_t代表的秒数转换成时间的字符串表示
ctime函数可以将秒数转换成当前系统时间的字符串表示,格式形如:"Day Mon dd hh:mm:ss yyyy\n"。例子参考下面的timeval一节。[cpp] view plain copy#include <sys/time.h> .... timeval tv; gettimeofday(&tv,NULL); std::cout<<ctime(&tv.tv_sec)<<endl;//将秒数转换成当前时间的字符串表示time_t转换成tm
localtime的声明如下:struct tm *localtime (__const time_t *__timer)
tm到time_t的转换
time_t mktime(struct tm * timeptr)
计算间隔
好像自己直接减法就可以了,不知道为什么需要这个函数。double difftime(time_t time1, time_t time0);
tm相关
获取当前时间
[cpp] viewplain copytime_t now = time(NULL); std::cout << ctime(&now) << std::endl; tm *tnow = localtime( &now );timeval相关
下面的代码演示了如何获取当前系统时间并转换成字符串:[cpp] view plain copy#include <sys/time.h> .... timeval tv; gettimeofday(&tv,NULL); std::cout<<ctime(&tv.tv_sec)<<endl;//将秒数转换成当前时间的字符串表示gettimeofday
获取当前时间,保存在timeval结构中。第二个参数是时区,已经废弃不用,只需要简单的传递NULL即可。相关文章推荐
- C/C++中的日期和时间 time_t与struct tm转换
- C++读取系统时间
- [C++基础] 取系统时间和随机数
- c和c++面试题探讨(题目以收录时间为序,不以难度排名)
- std空间声明的具体地方 和 标准C++有时间函数吗?
- C++编译时间过长解决方案
- 2006年4月度国际标准化组织C++会议纪要[原文发表时间:2006年5月3日]
- C/C++中的日期和时间
- C/C++中的日期和时间
- C++中取得时间的方法
- 时间和日历类的设计(Java的Date和Calendar的C++实现)
- [C++] 有关时间的操作方法
- C/C++中的日期和时间
- 时间和日历类的设计(Java的Date和Calendar的C++实现)
- 我用C++改写的在桌面上飘雪特效程序(现在放在这儿!明年再来改^_^#我没有时间改了今晚上才搞明天就要回家了)
- C/C++里边如何获得系统时间 【转载】
- C/C++中的日期和时间
- C/C++中的日期和时间
- zzC/C++中的日期和时间
- C++日期和时间