广告位联系
返回顶部
分享到

C++时间函数整理介绍

C语言 来源:互联网 作者:佚名 发布时间:2022-10-30 22:39:14 人浏览
摘要

一、 时间概念 格林威治时间GMT(Greenwich Mean Time) 格林威治皇家天文台为了海上霸权的扩张计划,在十七世纪就开始进行天体观测。为了天文观测,选择了穿过英国伦敦格林威治天文台

一、 时间概念

格林威治时间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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

    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上的存储值总是描述格林威治时间。

1

2

3

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结构指针。

1

2

3

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结构

1

2

3

4

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时间),以字符串的形式显示。

1

2

3

4

5

6

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是格林威治时间,输出来的值总是用来描述当地时间。

1

2

3

4

5

6

7

8

// 形式: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指向的数组中但不包含终止的空字符。否则,函数返回零,且数组的内容不确定。

一个常规用法

1

2

3

char* format = "%Y-%m-%d %H:%M:%S";

char strTime[100];

strftime(strTime, sizeof(strTime), format, tmTime);//2022-10-07 20:46:01

五、计时器-时间段

1

2

3

4

5

6

7

#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库。利用该库可以做时间运算和换算。

一个性能统计用法

1

2

3

4

5

6

7

8

9

10

11

#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;

//精确到微妙


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/u014677109/article/details/127491114
相关文章
  • C++使用easyX库实现三星环绕效果流程介绍

    C++使用easyX库实现三星环绕效果流程介绍
    功能1:使用图形化的方式描述地球围绕着太阳转动,月球围绕着地球转动 功能2:在转动的过程中当用户按下1,2,3,4,5,6,7时它可以变换出7种不
  • C++时间函数整理介绍
    一、 时间概念 格林威治时间GMT(Greenwich Mean Time) 格林威治皇家天文台为了海上霸权的扩张计划,在十七世纪就开始进行天体观测。为了天
  • C++中类的六大默认成员函数的介绍

    C++中类的六大默认成员函数的介绍
    一、类的默认成员函数 二、构造函数Date(形参列表) 构造函数主要完成初始化对象,相当于C语言阶段写的Init函数。 默认构造函数:无参的构
  • C/C++实现遍历文件夹最全方法总结介绍

    C/C++实现遍历文件夹最全方法总结介绍
    一、filesystem(推荐) 在c++17中,引入了文件系统,使用起来非常方便 在VS中,可以直接在项目属性中调整: 只要是C++17即以上都可 然后头文件
  • C语言实现手写Map(数组+链表+红黑树)的代码

    C语言实现手写Map(数组+链表+红黑树)的代码
    要求 需要准备数组集合(List) 数据结构 需要准备单向链表(Linked) 数据结构 需要准备红黑树(Rbtree)数据结构 需要准备红黑树和链表适配策略
  • MySQL系列教程之使用C语言来连接数据库

    MySQL系列教程之使用C语言来连接数据库
    写在前面 知道了 Java中使用 JDBC编程 来连接数据库了,但是使用 C语言 来连接数据库却总是连接不上去~ 立即安排一波使用 C语言连接 MySQL数
  • 基于C语言实现简单学生成绩管理系统

    基于C语言实现简单学生成绩管理系统
    一、系统主要功能 1、密码登录 2、输入数据 3、查询成绩 4、修改成绩 5、输出所有学生成绩 6、退出系统 二、代码实现 1 2 3 4 5 6 7 8 9 10 11
  • C语言实现共享单车管理系统

    C语言实现共享单车管理系统
    1.功能模块图; 2.各个模块详细的功能描述。 1.登陆:登陆分为用户登陆,管理员登陆以及维修员登录,登陆后不同的用户所执行的操作
  • C++继承与菱形继承的介绍

    C++继承与菱形继承的介绍
    继承的概念和定义 继承机制是面向对象程序设计的一种实现代码复用的重要手段,它允许程序员在保持原有类特性的基础上进行拓展,增加
  • C/C++指针介绍与使用介绍

    C/C++指针介绍与使用介绍
    什么是指针 C/C++语言拥有在程序运行时获得变量的地址和操作地址的能力,这种用来操作地址的特殊类型变量被称作指针。 翻译翻译什么
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计