一、时区相关概念

地球自西往东转动,东边比西边先看到太阳,所以东边的时间比西边的时间早。将地球经度按照24个时区进行划分,每个时区相隔的经度为15度。以英国伦敦(格林尼治天文台旧址)为中时区(零时区),向东有11个时区,向西也有11个时区,太平洋白令海峡所在经度为12区,东西各占一半。0时区向东每隔一个时区时间快1小时,向西每隔一个时区时间慢1小时。在12区中间,左边刚好比右边日期大1天。

UTC协调时间时间=世界标准时间=格林尼治时间=G.M.T(Greenwich Mean Time),指0时区所处的时间。

夏令时(阳光节约时/DST/Daylight Saving Time):因为北半球大部分国家在夏天日照时间较长,为了节约能源,让人们充分利用太阳光源,某些国家在夏天会人为地将时间设置快一个小时。例如美国每年3月的第二个星期日开始,至每年11月的第一个星期日为夏令时。

二、计算机时间

1970-01-01 00:00:00是计算机元年,因为Unix操作系统和C语言于1971年发布,所以将这一时间作为时间元年。在32位系统中由于采用带符号的32位整形数据类型处理unix时间,所以当unix时间大于2的32次方减一(0x7FFFFFFF),也就是时间在到达2038年1月19日03:14:07UTC时,再往后时间就会变成负值。如果采用64位整形处理unix时间,则完全够用。

1900-01-01 00:00:00一般作为NTP起始时间。在RTP/RTCP等网络协议中,当采用32位字段表示NTP时间戳时,当时间大于2的33次方减1(0xFFFFFFFF),NTP时间戳在2036年会发生溢出。但是由于在RTCP中一般仅仅计算NTP的差值,所以只要时间差不超过68年就可以了。

三、C库时间操作函数c

1、time

函数原型:time_t time(time_t* timer);

函数说明:获取系统UTC时间到1970-01-01 00:00:00的秒数。timer为NULL,通过返回值返回。也可以通过timer参数返回。time_t在32位系统下最大只能表示到2038-01-19 03:14:07,在64位系统下则完全够用

2、localtime

函数原型:struct tm* localtime(const timer_t* timer);

tm结构:

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;       /* 夏令时               */
         };

函数说明:将time_t类型值转换为tm结构,采用本地时区

线程安全:locltime为非线程安全函数,返回的为内部静态变量指针,linux下线程安全函数为localtime_r(),windows下没有

3、gmtime

函数原型:struct tm* gmtime(time_t* timer);

函数说明:将time_t类型值转换为tm结构,采用0时区

线程安全:linux下线程安全函数为gmtime_r()

4、mktime

函数原型:time_t mktime(struct tm* timeptr);

函数说明:计算将timeptr按照系统时区转换为0时区,然后到计算机元年间的秒数

例子:

#include
#include int main()
{time_t t = time(NULL);//or//time_t t;//time(&t);struct tm* tmLocalNow = localtime(&t);tmLocalNow->tm_year += 1900;tmLocalNow->tm_mon += 1;printf("local now datetime: %d.%02d.%02d %02d:%02d:%02d\n",tmLocalNow->tm_year,tmLocalNow->tm_mon,tmLocalNow->tm_mday,tmLocalNow->tm_hour,tmLocalNow->tm_min,tmLocalNow->tm_sec);struct tm* tmUTCNow = gmtime(&t);tmUTCNow->tm_year += 1900;tmUTCNow->tm_mon += 1;printf("UTC now datetime: %d.%02d.%02d %02d:%02d:%02d\n",tmUTCNow->tm_year,tmUTCNow->tm_mon,tmUTCNow->tm_mday,tmUTCNow->tm_hour,tmUTCNow->tm_min,tmUTCNow->tm_sec);return 0;
}

线程不安全例子:

#include
#include int main()
{time_t t1 = time(NULL);time_t t2 += 1800;struct tm* tm1 = localtime(&t1);struct tm* tm2 = localtime(&t2);//执行到这里的时候tm1值变为tm2,因为内部他们指向的是同一内存地址return 0;
}

5、Sleep/sleep/usleep

Sleep(毫秒)为windows下挂起函数,精确到毫秒级

sleep(秒)为linux下挂起函数,精确到秒级。

usleep(微秒)为linux下挂起函数,精确到微秒级。

Sleep()在windows下挂起后仍然会占用CPU处理时间,而sleep()和usleep()在linux下不会占用

6、clock

函数原型:clock_t clock();

函数说明,返回从程序执行时起到现在,消耗的处理器时间(不是程序执行时间)对应的时钟数,每秒钟处理器的时钟数为CLOCKS_PER_SEC。

例子:

#ifdef WIN32
#include
#else
#include
#endif#include int main()
{clock_t clockStart;clockStart = clock();
#ifdef WIN32Sleep(2000);
#elsesleep(2);
#endifclock_t clockEnd;clockEnd = clock();double dInterval = (double)(clockEnd - clockStart) / CLOCKS_PER_SEC;printf("interval: %f\n", dInterval);
}

执行结果:

linux下为0.000040,windows下为2.001000,因为linux下sleep()不占用CPU处理时间,而windows下Sleep()下占用系统时间。

四、linux时间系统函数

1、gettimeofday

获取当前时间,返回从计算机元年到现在经历的时间。

头文件:

sys/time.h

unistd.h

函数声明:int gettimeofday(struct timeval* tv, struct timezone* tz);

timeval结构定义为:

struct timeval

    long tv_sec; /*秒*/ 
    long tv_usec; /*微秒*/ 
}; 
timezone 结构定义为: 
struct timezone

    int tz_minuteswest; /*和Greenwich 时间差了多少分钟*/ 
    int tz_dsttime; /*日光节约时间的状态*/ 
}; 
上述两个结构都定义在/usr/include/sys/time.h。tz_dsttime 所代表的状态如下 
DST_NONE /*不使用*/ 
DST_USA /*美国*/ 
DST_AUST /*澳洲*/ 
DST_WET /*西欧*/ 
DST_MET /*中欧*/ 
DST_EET /*东欧*/ 
DST_CAN /*加拿大*/ 
DST_GB /*大不列颠*/ 
DST_RUM /*罗马尼亚*/ 
DST_TUR /*土耳其*/ 
DST_AUSTALT /*澳洲(1986年以后)*/
返回值:成功则返回0,失败返回-1,错误代码存于errno。附加说明EFAULT指针tv和tz所指的内存空间超出存取权限。

2、settimeofday()

设置当前时间,只有root权限才能使用此函数修改时间。

头文件:

sys/time.h

unistd.h

函数声明:int settimeofday(struct timeval* tv, struct timezone* tz);

返回值:成功则返回0,失败返回-1,错误代码存于errno。

错误代码:
EPERM 并非由root权限调用settimeofday(),权限不够。 
EINVAL 时区或某个数据是不正确的,无法正确设置时间。

3、clock_gettime

函数声明:int clock_gettime(clockid_t clk_id,struct timespec* tp);

clk_id取值

CLOCK_REALTIME:系统从计算机元年到现在的时间,随系统时间变化而变化

CLOCK_MONOTONIC:系统启动到现在的时间,不随系统时间变化而变化

CLOCK_PROCESS_CPUTIME_ID:本进程从启动到现在CPU花费的时间,sleep和usleep不占用cpu时间

CLOCK_THREAD_CPUTIME_ID:本线程从启动到现在CPU花费的时间

timespec结构

struct timespec
{
        time_t tv_sec; /* 秒*/
        long tv_nsec; /* 纳秒*/
};

五、windows时间系统函数

1、GetLocalTime

获取当前系统时间,以系统时区为标准,精确到毫秒级。

函数声明:void GetLocalTime(LPSYSTEMTIME lpSystemTime);

SYSTMETIME结构定义:

typedef struct _SYSTEMTIME

{

WORD wYear;//年

WORD wMonth;//月

WORD wDayOfWeek;//星期

WORD wDay;//日

WORD wHour;//时

WORD wMinute;//分

WORD wSecond;//秒

WORD wMilliseconds;//毫秒

}SYSTEMTIME,*PSYSTEMTIME;

2、GetSystemTime

获取当前系统时间,以0时区为标准。

3、SetLocalTime

设置系统本地时间

4、SetSystemTime

设置系统UTC时间

5、GetTickCount

返回操作系统启动到现在所经过的毫秒数

函数声明:DWORD GetTickCount(void);

GetTickCount()和Clock()函数是向主板BIOS要real time clock时间,会有中断产生,以及延迟问题。

6、QueryPerformaceFrequency和QueryPerformanceCounter

返回硬件支持的高精度计数器的频率,返回系统从启动到现在的时间。

函数声明:

BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);

BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);

参数类型定义如下:

typeef union _ LARGE_INTEGER

{

struct

{

DWORD LowPart;

LONG HighPart;

};

LONGLONG QuadPart;

} LARGE_INTEGER;

QueryPerformanceCounter获取系统启动到现在计数器时钟数。QueryPerformanceFrequency获取系统的时钟频率,也就是每秒系统的时钟数。

例子:


#include int main()
{LARGE_INTEGER lagerCounter1;QueryPerformanceCounter(&lagerCounter1);long long llCounter1 = lagerCounter1.QuadPart;Sleep(2000);LARGE_INTEGER lagerCounter2;QueryPerformanceCounter(&lagerCounter2);long long llCounter2 = lagerCounter2.QuadPart;LARGE_INTEGER largerFreq;QueryPerformanceFrequency(&largerFreq);long long llFreq = largerFreq.QuadPart;double dIntervals = (llCounter2 - llCounter1) / llFreq;printf("the interval is: %f",dIntervals);
}

例子输出为2.0。

参考:

1.https://blog.csdn.net/hmxz2nn/article/details/77986450

2.https://blog.csdn.net/tsx86/article/details/49965171

3.https://blog.csdn.net/weixin_34295316/article/details/86061183

c/c++时间操作函数总结相关推荐

  1. mysql存储过程时间_mysql时间操作函数和存储过程

    因为业务须要统计一批数据.用到关于mysql的时间操作函数和存储过程,问题已经基本解决.把过程记录下: 1. mysql的语句中不支持直接用循环.循环仅仅能在存储过程中使用. 2. 写为文件时,注意一 ...

  2. mysql日期时间操作函数详解

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. win7可以设定每周从哪一天开始,win2003等不能方便的修改.有的是周日开始,有的是周一开始.而 ...

  3. C#——常用的日期时间操作函数

    C#--常用的日期时间操作函数 C# 获取系统时间 System.DateTime currentTime=new System.DateTime(); 计算2个日期之间的天数差 DateTime d ...

  4. asp系统转换php系统时间函数,ASP_ASP中的时间函数大全 时间操作函数,Date 函数 描述:返回当前系统日 - phpStudy...

    ASP中的时间函数大全 时间操作函数 Date 函数 描述:返回当前系统日期. 语法:Date DateAdd 函数 描述:返回已添加指定时间间隔的日期. 语法:DateAdd(interval, n ...

  5. php时间操作函数总结,基于php常用函数总结(数组,字符串,时间,文件操作)

    数组:[重点1]implode(分隔,arr) 把数组值数据按指定字符连接起来 例如: $arr=array('1','2','3','4'); $str=implode('-',$arr); exp ...

  6. MySQL 日期/时间 操作函数(2.1)

    原文:http://www.51sdj.com/phpcms/picture/2009/0711/picture_133.html 一.MySQL 获得当前日期时间 函数 1.1 获得当前日期+时间 ...

  7. linux 修改微秒时间,Linux系统下精确到微秒级的时间操作函数

    Linux下对时间进行运算,如果是到秒级的,相信大家都用过time之类的函数实现了,但要更精确些呢?到毫秒.微秒级呢?本文引用地址:http://www.eepw.com.cn/article/201 ...

  8. java取服务器时间的函数,非常有用的Java日期时间操作函数代码一览

    /** 日期类 * @date * @version 1.0 */ import java.util.*; import java.text.*; import java.util.Calendar; ...

  9. 时间:2014年3月27日文件和目录操作函数

    主要内容: 目录操作:打开.读取.关闭.创建.重命名.删除 文件操作:打开.读.写.关闭.重命名.删除 信息获取函数 filemtime() filesize() file_exists()  is_ ...

最新文章

  1. mysql 1067 42000_MySQL:ERROR 1067 (42000): Invalid default value for 'end_time'
  2. python 画系统关联图_Python基于pyecharts实现关联图绘制
  3. 清华团队CrossWOZ: 这篇顶会,助你徒手搭建任务导向对话系统
  4. mysql 1066解决方法_MySQL查询语法帮助:错误#1066-表格/别名不唯...
  5. html+字体图标找不到字体,bootstrap中不显示字体图标问题怎么解决?
  6. Django框架——HttpRequest对象
  7. JAVA SAX解析XML文档
  8. 窗口最小化消息的解决之道
  9. 深入浅出分析MySQL常用存储引擎
  10. SpringCloud工作笔记046---SpringCloud https证书申请_不同证书区别
  11. 布局篇(1)—If you love css …
  12. 几何画板是哪方面的计算机应用,几何画板最新版
  13. spring configuration注解原理
  14. iSlide2022免费PPT插件(包含众多PPT模板/素材)
  15. 相关系数excel_怎么制作高光谱遥感数据波段间相关系数热力图
  16. 应聘新要求:填写恋爱经历?
  17. 二进制学习-反跟踪技术
  18. 2.1.1队列——雏形(初始版本)
  19. 和风天气获取天气情况
  20. 我的世界服务器创世神文件夹,我的世界服务器怎么给创世神权限的指令

热门文章

  1. Document contains at least one immense term in field=“****“ (whose UTF8 encoding is longer than t
  2. css box-sizing:border-box
  3. 大学生硕士生自学JAVA路线和书籍推荐
  4. 关于ubuntu18.04部署ROS系统
  5. springboot配置swagger
  6. sklearn.covariance(协方差)模块结构及用法
  7. 拾光·印记婚纱摄影管理系统的设计与实现mysql
  8. MacBook的程序坞(任务栏)主屏副屏幕切换
  9. vjudge使用指南
  10. 【强化学习】玩转Atari-Pong游戏