C++时间

概念

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]  view plain  copy
  1. #ifdef __need_timeval  
  2. # undef __need_timeval  
  3. # ifndef _STRUCT_TIMEVAL  
  4. #  define _STRUCT_TIMEVAL       1  
  5. #  include <bits/types.h>  
  6.   
  7. /* A time value that is accurate to the nearest 
  8.    microsecond but also has a range of years.  */  
  9. struct timeval  
  10.   {  
  11.     __time_t tv_sec;            /* Seconds.  */  
  12.     __suseconds_t tv_usec;      /* Microseconds.  */  
  13.   };  
  14. # endif /* struct timeval */  
  15. #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]  view plain  copy
  1. #ifdef  _TIME_H  
  2. __BEGIN_NAMESPACE_STD  
  3. /* Used by other time functions.  */  
  4. struct tm  
  5. {  
  6.   int tm_sec;                   /* Seconds.     [0-60] (1 leap second) */  
  7.   int tm_min;                   /* Minutes.     [0-59] */  
  8.   int tm_hour;                  /* Hours.       [0-23] */  
  9.   int tm_mday;                  /* Day.         [1-31] */  
  10.   int tm_mon;                   /* Month.       [0-11] */  
  11.   int tm_year;                  /* Year - 1900.  */  
  12.   int tm_wday;                  /* Day of week. [0-6] */  
  13.   int tm_yday;                  /* Days in year.[0-365] */  
  14.   int tm_isdst;                 /* DST.         [-1/0/1]*/  
  15.   
  16. #ifdef  __USE_BSD  
  17.   long int tm_gmtoff;           /* Seconds east of UTC.  */  
  18.   __const char *tm_zone;        /* Timezone abbreviation.  */  
  19. #else  
  20.   long int __tm_gmtoff;         /* Seconds east of UTC.  */  
  21.   __const char *__tm_zone;      /* Timezone abbreviation.  */  
  22. #endif  
  23. };  


 

相关C函数

time_t相关

time_t代表的秒数转换成时间的字符串表示

ctime函数可以将秒数转换成当前系统时间的字符串表示,格式形如:"Day Mon dd hh:mm:ss yyyy\n"。例子参考下面的timeval一节。

[cpp]  view plain  copy
  1. #include <sys/time.h>  
  2.   
  3. ....  
  4.   
  5. timeval tv;  
  6. gettimeofday(&tv,NULL);  
  7. 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]  view plain  copy
  1. time_t now = time(NULL);  
  2. std::cout << ctime(&now) << std::endl;  
  3. tm *tnow = localtime( &now );  


 

timeval相关

下面的代码演示了如何获取当前系统时间并转换成字符串:

[cpp]  view plain  copy
  1. #include <sys/time.h>  
  2. ....  
  3. timeval tv;  
  4. gettimeofday(&tv,NULL);  
  5. std::cout<<ctime(&tv.tv_sec)<<endl;//将秒数转换成当前时间的字符串表示  



gettimeofday

获取当前时间,保存在timeval结构中。
第二个参数是时区,已经废弃不用,只需要简单的传递NULL即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值