c/c++时间操作函数总结
一、时区相关概念
地球自西往东转动,东边比西边先看到太阳,所以东边的时间比西边的时间早。将地球经度按照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++时间操作函数总结相关推荐
- mysql存储过程时间_mysql时间操作函数和存储过程
因为业务须要统计一批数据.用到关于mysql的时间操作函数和存储过程,问题已经基本解决.把过程记录下: 1. mysql的语句中不支持直接用循环.循环仅仅能在存储过程中使用. 2. 写为文件时,注意一 ...
- mysql日期时间操作函数详解
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. win7可以设定每周从哪一天开始,win2003等不能方便的修改.有的是周日开始,有的是周一开始.而 ...
- C#——常用的日期时间操作函数
C#--常用的日期时间操作函数 C# 获取系统时间 System.DateTime currentTime=new System.DateTime(); 计算2个日期之间的天数差 DateTime d ...
- asp系统转换php系统时间函数,ASP_ASP中的时间函数大全 时间操作函数,Date 函数 描述:返回当前系统日 - phpStudy...
ASP中的时间函数大全 时间操作函数 Date 函数 描述:返回当前系统日期. 语法:Date DateAdd 函数 描述:返回已添加指定时间间隔的日期. 语法:DateAdd(interval, n ...
- php时间操作函数总结,基于php常用函数总结(数组,字符串,时间,文件操作)
数组:[重点1]implode(分隔,arr) 把数组值数据按指定字符连接起来 例如: $arr=array('1','2','3','4'); $str=implode('-',$arr); exp ...
- MySQL 日期/时间 操作函数(2.1)
原文:http://www.51sdj.com/phpcms/picture/2009/0711/picture_133.html 一.MySQL 获得当前日期时间 函数 1.1 获得当前日期+时间 ...
- linux 修改微秒时间,Linux系统下精确到微秒级的时间操作函数
Linux下对时间进行运算,如果是到秒级的,相信大家都用过time之类的函数实现了,但要更精确些呢?到毫秒.微秒级呢?本文引用地址:http://www.eepw.com.cn/article/201 ...
- java取服务器时间的函数,非常有用的Java日期时间操作函数代码一览
/** 日期类 * @date * @version 1.0 */ import java.util.*; import java.text.*; import java.util.Calendar; ...
- 时间:2014年3月27日文件和目录操作函数
主要内容: 目录操作:打开.读取.关闭.创建.重命名.删除 文件操作:打开.读.写.关闭.重命名.删除 信息获取函数 filemtime() filesize() file_exists() is_ ...
最新文章
- mysql 1067 42000_MySQL:ERROR 1067 (42000): Invalid default value for 'end_time'
- python 画系统关联图_Python基于pyecharts实现关联图绘制
- 清华团队CrossWOZ: 这篇顶会,助你徒手搭建任务导向对话系统
- mysql 1066解决方法_MySQL查询语法帮助:错误#1066-表格/别名不唯...
- html+字体图标找不到字体,bootstrap中不显示字体图标问题怎么解决?
- Django框架——HttpRequest对象
- JAVA SAX解析XML文档
- 窗口最小化消息的解决之道
- 深入浅出分析MySQL常用存储引擎
- SpringCloud工作笔记046---SpringCloud https证书申请_不同证书区别
- 布局篇(1)—If you love css …
- 几何画板是哪方面的计算机应用,几何画板最新版
- spring configuration注解原理
- iSlide2022免费PPT插件(包含众多PPT模板/素材)
- 相关系数excel_怎么制作高光谱遥感数据波段间相关系数热力图
- 应聘新要求:填写恋爱经历?
- 二进制学习-反跟踪技术
- 2.1.1队列——雏形(初始版本)
- 和风天气获取天气情况
- 我的世界服务器创世神文件夹,我的世界服务器怎么给创世神权限的指令
热门文章
- Document contains at least one immense term in field=“****“ (whose UTF8 encoding is longer than t
- css box-sizing:border-box
- 大学生硕士生自学JAVA路线和书籍推荐
- 关于ubuntu18.04部署ROS系统
- springboot配置swagger
- sklearn.covariance(协方差)模块结构及用法
- 拾光·印记婚纱摄影管理系统的设计与实现mysql
- MacBook的程序坞(任务栏)主屏副屏幕切换
- vjudge使用指南
- 【强化学习】玩转Atari-Pong游戏