C++时间函数整理详解

目录
  • 一、 时间概念
    • 原子时间
    • 世界协调时
    • 本地时间
  • 二、Linux-c时间的存储方式
    • 1. time_t
    • 2. struct tm
  • 三、 常用函数
  • 四、 时间格式化
  • 五、计时器-时间段
  • 六、chrono

一、 时间概念

格林威治时间GMT(Greenwich Mean Time)

格林威治皇家天文台为了海上霸权的扩张计划,在十七世纪就开始进行天体观测。为了天文观测,选择了穿过英国伦敦格林威治天文台子午仪中心的一条经线作为零度参考线,这条线,简称格林威治子午线。

1884年10月召开了一个国际子午线会议,该会议将格林威治子午线设定为本初子午线,并将格林威治平时 (GMT, Greenwich Mean Time) 作为世界时间标准(UT, Universal Time)。由此也确定了全球24小时自然时区的划分,所有时区都以和 GMT 之间的偏移量做为参考。

1972年之前,格林威治时间(GMT)一直是世界时间的标准。1972年之后,GMT 不再是一个时间标准了。

XP系统中,默认时间格式是GMT。

目前UTC与GMT 相差为0.9秒,故二者可以基本视为一致。

原子时间

1967年,人们利用铯原子振荡周期极为规律的特性,研制出了高精度的原子时钟,将铯原子能级跃迁辐射9192631770周所经历的时间定为1s。现在用的时间就是1971年10月定义的国际原子时,是通过世界上大约200多台原子钟进行对比后,再由国际度量衡局时间所进行数据处理,得出的统一的原子时,简称TAI。

世界协调时

又称世界统一时间、世界标准时间。UTC是现在全球通用的时间标准,全球各地都同意将各自的时间进行同步协调。UTC 时间是经过平均太阳时(以格林威治时间GMT为准)、地轴运动修正后的新时标以及以秒为单位的国际原子时所综合精算而成。

UTC 构成:

原子时间(TAI):

结合了全球400个所有的原子钟而得到的时间,它决定了我们每个人的钟表中,时间流动的速度。

世界时间(UT, Universal Time):

也称天文时间,或太阳时,他的依据是地球的自转,我们用它来确定多少原子时,对应于一个地球日的时间长度。

格式: YYYY-MM-DDThh:mm:ssZ

协调世界时不与任何地区位置相关,也不代表此刻某地的时间,所以在说明某地时间时要加上时区。也就是说GMT并不等于UTC,而是等于UTC+0,只是格林尼治刚好在0时区上。GMT = UTC+0。

本地时间

在日常生活中所使用的时间我们通常称之为本地时间。这个时间等于我们所在(或者所使用)时区内的当地时间,它由与世界标准时间(UTC)之间的偏移量来定义。这个偏移量可以表示为 UTC- 或 UTC+,后面接上偏移的小时和分钟数。

GMT是前世界标准时,UTC是现世界标准时。

UTC 比 GMT更精准,以原子时计时,适应现代社会的精确计时。

但在不需要精确到秒的情况下,二者可以视为等同。

每年格林尼治天文台会发调时信息,基于UTC。

二、Linux-c时间的存储方式

1. time_t

一个整型,存储从1970-1-1 00:00:00年到现在UTC+0经过了多少秒,进一步的,struct timeval可精确到微秒。

2. struct tm

用一个结构来分别存储年月日时分秒。

	struct tm
	{
	    int tm_sec;  /*秒,正常范围0-59, 但允许至61*/
	    int tm_min;  /*分钟,0-59*/
	    int tm_hour; /*小时, 0-23*/
	    int tm_mday; /*日,即一个月中的第几天,1-31*/
	    int tm_mon;  /*月, 从一月算起,0-11*/  1+p->tm_mon;
	    int tm_year;  /*年, 从1900至今已经多少年*/  1900+ p->tm_year;
	    int tm_wday; /*星期,一周中的第几天, 从星期日算起,0-6*/
	    int tm_yday; /*从今年1月1日到目前的天数,范围0-365*/
	    int tm_isdst; /*日光节约时间的旗标*/
	};
特别注意,年份是从1900年起至今多少年,而不是直接存储如2022年。月份从0开始的,0表示一月,星期也是从0开始的, 0表示星期日,1表示星期一。

三、 常用函数

#include <time.h>

#include <sys/time.h>

time_t time(time_t* t);

取得从1970-1-1 00:00:00至今(UTC+0)的秒数,注意并不是至本地时间的秒数。该时间戳为GMT时间,即时区为0。

time()总是返回的是当前格林威治时间,不论系统/程序采用的哪个时区。所以使用time_t时候,让time_t上的存储值总是描述格林威治时间。

    time_t tm = time(nullptr);//取得从1970-1-1 00:00:00至今(UTC+0)的秒数
    //或
    time(&tm0);

struct tm* gmtime(const time_t* timep);

将time_t表示的时间戳转换为没有经过时区转换的UTC时间,是一个struct tm结构指针。

    struct tm *tmStamp = nullptr;
    time_t tmSec = time(nullptr);
    tmStamp = gmtime(&tmSec);   //返回没有经过时区转换的UTC时间 struct tm结构

struct tm* localtime(const time_t* timep);

将time_t表示的时间戳转换换成经过时区转换的时间。使用time_t格林威治时间+时区偏差,生成tm结构

    struct tm *tmStamp = nullptr;
    time_t tmSec;
    time(&tmSec); //取得从1970年1月1日至今的秒数
    tmStamp = localtime(&tmSec); //返回经过时区转换的时间,***注意本函数可能会修改时间秒的值***

time_t mktime(struct tm* timeptr);

将struct tm 结构的时间转换为从1970-1-1年至今的秒数。

mktime考虑了时区,输入的值总是要求【localtime-tm】结构-当前时区时间,输出值格林威治时间;

char asctime(const struct tm timeptr);

将struct tm结构中的信息转换为真实世界的时间(不经过时区转换的UTC时间),以字符串的形式显示。

    time_t timeSec;
    time(&timeSec); /*获取time_t类型的当前时间*/
    /*用gmtime将time_t类型的时间转换为struct tm类型的时间,按没有经过时区转换的UTC时间
      然后再用asctime转换为我们常见的格式 ,形式:Mon Oct 24 11:41:17 2022
    */
    printf("%s", asctime(gmtime(&timeSec))); //没有经过时区转换的UTC时间

char ctime(const time_t timep);

将 time_t时间秒表示的时间转换为真实世界的时间(经时区转换的UTC时间),以字符串显示。

ctime考虑了时区,输入值要求time_t是格林威治时间,输出来的值总是用来描述当地时间。

// 形式:Mon Oct 24 11:41:17 2022
``
## 7. gettimeofday(&tmval,&zone); // for linux
返回当前距离1970年的秒数和微妙数,后面的tz是时区,一般不用传NULL。
```c
	struct timezone zone;
    struct timeval tmval;
    gettimeofday(&tmval,&zone); // for linux

double difftime(time_t time1, time_t time2);

返回两个时间秒相差的秒数。

ctime返回的是静态变量地址;更要注意gmtime与localtime返回的静态变量地址是同一个,后调用的会覆盖上次调用的值;

tm结构存储值有时用来描述格林威治时间gmtime,有时用来描述当地时间localtime-当前时区时间。

四、 时间格式化

size_t strftime(char *str, size_t count, const char *format, const struct tm *tm)

函数原型
#include <time.h>
size_t strftime(char *str, size_t count, const char *format, const struct tm *tm);
参数说明
  str, 表示返回的时间字符串
  count, 要写入的字节的最大数量
  format, 格式字符串由零个或多个转换符和普通字符(除%)
  tm, 输入时间
返回值
  如果包含终止的空字符在内的结果字符的总数不大于count,则函数strftime返回字符数,这些字符被放到s指向的数组中但不包含终止的空字符。否则,函数返回零,且数组的内容不确定。

一个常规用法

	char* format = "%Y-%m-%d %H:%M:%S";
    char strTime[100];
    strftime(strTime, sizeof(strTime), format, tmTime);//2022-10-07 20:46:01

五、计时器-时间段

#include <time.h>
#include <iostream>
using namespace std;
clock_t start = clock();
// do something...
clock_t end   = clock();
cout << "花费了" << (double)(end - start) / CLOCKS_PER_SEC << "秒" << endl;

可精确到毫秒

六、chrono

C++ 11 标准库引入了chrono库。利用该库可以做时间运算和换算。

一个性能统计用法

#include <chrono>
using namespace std;
using namespace chrono;
auto start = system_clock::now();
// do something...
auto end   = system_clock::now();
auto duration = duration_cast<microseconds>(end - start);
cout <<  "花费了"
     << double(duration.count()) * microseconds::period::num / microseconds::period::den
     << "秒" << endl;
//精确到微妙

到此这篇关于C++时间函数整理详解的文章就介绍到这了,更多相关C++时间函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 基于C/C++时间函数的使用详解

    C/C++对时间的操作也有许多值得大家注意的地方.最近,在技术群中有很多网友也多次问到过C++语言中对时间的操作.获取和显示等等的问题.下面,在这篇文章中,笔者将主要介绍在C/C++中时间和日期的使用方法.通过学习许多C/C++库,你可以有很多操作.使用时间的方法.但在这之前你需要了解一些"时间"和"日期"的概念,主要有以下几个:Coordinated Universal Time(UTC):协调世界时,又称为世界标准时间,也就是大家所熟知的格林威治标准时间(Gre

  • c++制作的时间函数类

    实现类的定义,以及调用 Clock时间类的头文件Clock.h //#pragma once #ifndef _CLOCK_H_ #define _CLOCK_H_ class Clock { public: void Init(int hour, int minute, int second); void Display(); void Update(); int GetHour(); int GetMinute(); int GetSecond(); void SetHour(int hou

  • c/c++获取系统时间函数的方法示例

    概念 在C/C++中,对字符串的操作有很多值得注意的问题,同样,C/C++对时间的操作也有许多值得大家注意的地方.最近,在技术群中有很多网友也多次问到过C++语言中对时间的操作.获取和显示等等的问题. 下面,在这篇文章中,笔者将主要介绍在C/C++中时间和日期的使用方法. 通过学习许多C/C++库,你可以有很多操作.使用时间的方法.但在这之前你需要了解一些"时间"和"日期"的概念,主要有以下几个: Coordinated Universal Time(UTC):协调

  • C++时间函数整理详解

    目录 一. 时间概念 原子时间 世界协调时 本地时间 二.Linux-c时间的存储方式 1. time_t 2. struct tm 三. 常用函数 四. 时间格式化 五.计时器-时间段 六.chrono 一. 时间概念 格林威治时间GMT(Greenwich Mean Time) 格林威治皇家天文台为了海上霸权的扩张计划,在十七世纪就开始进行天体观测.为了天文观测,选择了穿过英国伦敦格林威治天文台子午仪中心的一条经线作为零度参考线,这条线,简称格林威治子午线. 1884年10月召开了一个国际子

  • Go语言学习之时间函数使用详解

    目录 引言 1. 时间格式化 2. 示例 引言 1946年2月14日,人类历史上公认的第一台现代电子计算机“埃尼阿克”(ENIAC)诞生. 计算机语言时间戳是以1970年1月1日0点为计时起点时间的.计算机诞生为1946年2月14日,而赋予生命力时间是从1970年1月1日0点开始. Hour 1小时=60分钟 Minute 1分钟=60秒 Second 1秒=1000毫秒 Millsecond 1毫秒=1000微秒 Microsecond 1微秒=1000纳秒 Nanoseco 1纳秒 1. 时

  • PHP时间函数使用详解

    PHP开发中,关于时间函数的使用基本上可以说是无处不在,而PHP中操作时间的方法也很多,比如PHP时间戳.日期与时间戳之间的转换.获取当前日期.当前时间之前或之后的时间等等,下面我们详细讲述一下PHP中各种时间函数的使用. 首先需要知道的是在php中获取时间方法是date(),在php中获取时间戳方法有time().strtotime().下面分别说明. date() 格式为:date($format, $timestamp),format为格式.timestamp为时间戳(可选). time(

  • MySQL获得当前日期时间函数示例详解

    获得当前日期+时间(date + time)函数:now() mysql> select now(); +---------------------+ | now() | +---------------------+ | 2008-08-08 22:20:46 | +---------------------+ 获得当前日期+时间(date + time)函数:sysdate() sysdate() 日期时间函数跟 now() 类似,不同之处在于:now() 在执行开始时值就得到了, sysd

  • 基于linux下获取时间函数的详解

    //-------------------------------------------------------------//asctime(将时间和日期以字符串格式表示)#include<time.h>定义函数char * asctime(const struct tm * timeptr);函数说明asctime()将参数timeptr所指的tm结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果以字符串形态返回.此函数已经由时区转换成当地时间,字符串格式为:"We

  • php checkdate、getdate等日期时间函数操作详解

    checkdate($month,$date,$year) 如果应用的值构成一个有效日期,则该函数返回为真.例如,对于错误日期2005年2月31日,此函数返回为假. 在日期用于计算或保存在数据库中之前,可用此函数检查日期并使日期生效. 复制代码 代码如下: <?php // returns false echo checkdate(2,30,2005) ? "valid" : "invalid"; // returns true echo checkdate(

  • JS的时间格式化和时间戳转换函数示例详解

    JS的时间格式化和时间戳转换函数 //格式化时间 function dateFormat(fmt,date){ var o = { "M+" : date.getMonth()+1, //月份 "d+" : date.getDate(), //日 "h+" : date.getHours(), //小时 "m+" : date.getMinutes(), //分 "s+" : date.getSeconds

  • calendar在python3时间中常用函数举例详解

    想要在python中写代码游刃有余,没有函数的支持是万万不行的.很多小伙伴反映,最近函数的应用知识不够了,所以小编挑选了python3时间中的函数,希望可以帮助大家在处理日历方面更加的迅速.其他更多的函数,大家也可以自行去搜集一点资料学习,小编就讲几个最简单的吧. 1.firstweekday() firstweekday(): 返回当前每周起始日期值.默认情况下,首次载入calendar模块时返回0,即星期一 import calendar # 0 print(calendar.firstwe

  • Python中非常实用的Math模块函数教程详解

    目录 math模块常数 1. 圆周率 2. Tau (τ) 3. 欧拉数 4. 无限 5. 不是数字 算术函数 1. factorial() 2. ceil() 3. floor() 4. trunc() 5. isclose() 幂函数 1. exp() 2. 对数函数 其他重要的math模块功能 由于该math模块与 Python 版本一起打包,因此您不必单独安装它,直接导入: import math math模块常数 Pythonmath模块提供了多种预定义常量.访问这些常量提供了几个优点

  • JavaScript 函数节流详解及方法总结

    JavaScript 函数节流详解 浏览器一个网页的UI线程只有一个,他同时会处理界面的渲染和页面JavaScript代码的执行(简单扩展一下,浏览器或者JavaScript运行大环境并不是单线程,诸如ajax异步回调.hybrid框架内与native通信.事件队列.CSS运行线程等等都属于多线程环境,不过ES6引入了Promise类来减少了部分异步情况).因此当JavaScript代码运行计算量很大的方法时,就有可能阻塞UI线程,小则导致用户响应卡顿,严重的情况下浏览器会提示页面无响应是否强制

随机推荐