C++中的时间相关处理

news/2025/1/12 22:03:27/

time.h

在C++11之前,C++ 程序员通常使用 C 语言标准库中的时间和日期函数来处理时间,这些函数的精度通常只有秒级别。这些传统的 C 语言 API 包括 time.h 头文件中定义的函数,如 time(), gmtime(), localtime(), mktime() 等。这些函数使用 time_t 类型来表示时间,并且与 struct tm 结构体一起使用来处理日期和时间。

#include <iostream>
#include <ctime>int main() {// 获取当前时间time_t now = time(nullptr);// 将 time_t 类型的时间转换为 tm 结构体,以便于读取和格式化tm* local_time = localtime(&now);// 打印当前时间的各个部分std::cout << "Current year: " << 1900 + local_time->tm_year << std::endl;std::cout << "Current month: " << 1 + local_time->tm_mon << std::endl;std::cout << "Current day: " << local_time->tm_mday << std::endl;std::cout << "Current hour: " << local_time->tm_hour << std::endl;std::cout << "Current minute: " << local_time->tm_min << std::endl;std::cout << "Current second: " << local_time->tm_sec << std::endl;// 使用 asctime() 将 tm 结构体转换为可读的字符串形式std::cout << "Current time: " << asctime(local_time);// 使用 mktime() 来将 tm 结构体转换为 time_t 类型的时间戳time_t time_from_tm = mktime(local_time);// 再次打印转换后的时间戳std::cout << "Time from tm struct: " << ctime(&time_from_tm);// 使用 difftime() 计算两个时间的差(秒)time_t future_time = now + 3600; // Add one hour to the current timedouble time_difference = difftime(future_time, now);std::cout << "Time difference: " << time_difference << " seconds" << std::endl;return 0;
}

由于这些传统方法在处理时间和日期时存在局限性,例如精度不足以及跨平台兼容性问题,C++11 引入了 std::chrono 库,它提供了更高精度的时间间隔和时钟,以及时间点的表示,从而极大地改进了 C++ 中的时间处理能力。

C++11中的引入的时间处理部分:chrono

主要组件

  • 时钟(Clocks):std::chrono提供了不同类型的时钟,主要有以下几种:

    • std::chrono::system_clock:基于系统时间的时钟,可能会受到系统时间变化的影响。
    • std::chrono::steady_clock:提供一个稳定的时间来源,不受系统时间调整的影响。
    • std::chrono::high_resolution_clock:通常提供最高的时间分辨率。
  • 时间间隔(Duration):std::chrono::duration类模板用于表示两个时间点之间的时间长度。它非常灵活,允许用户指定时间单位,如秒、毫秒、微秒等。

  • 时间点(Time Points):std::chrono::time_point类模板表示特定的时间点。结合时钟和持续时间,它可以表示从纪元(通常是1970年1月1日午夜)开始的某个具体时间。

使用场景

  • 性能测量:通过计算两个时间点之间的差异,可以测量代码块的执行时间。
  • 定时任务:可以创建定时任务,比如使用std::this_thread::sleep_for让线程暂停执行一段时间。
  • 时间格式化:可以将时间点格式化为易读的字符串形式。

demo代码

性能测量:

#include <iostream>
#include <chrono>
#include <thread>void func1(int matrix[1000][1000]){for(auto i=0;i<1000;i++){for(auto j=0;j<1000;j++){matrix[i][j] += 1;}}
}void func2(int matrix[1000][1000]){for(auto i=0;i<1000;i++){for(auto j=0;j<1000;j++){matrix[j][i] += 1;}}
}int main(){int matrix[1000][1000] = {0};auto start = std::chrono::steady_clock::now();func1(matrix);auto end = std::chrono::steady_clock::now();auto dt = end-start;int64_t duration = std::chrono::duration_cast<std::chrono::milliseconds>(dt).count();std::cout << "func1 run time:" << duration << std::endl;start = std::chrono::steady_clock::now();func2(matrix);end = std::chrono::steady_clock::now();dt = end-start;duration = std::chrono::duration_cast<std::chrono::milliseconds>(dt).count();std::cout << "func2 run time:" << duration << std::endl;return 0;
} 

定时任务:

#include <iostream>
#include <chrono>
#include <thread>int main() {// 获取当前时间点auto now = std::chrono::system_clock::now();// 休眠1秒std::this_thread::sleep_for(std::chrono::seconds(1));// 再次获取当前时间点auto later = std::chrono::system_clock::now();// 计算时间差auto duration = later - now;int64_t sec = std::chrono::duration_cast<std::chrono::seconds>(duration).count();std::cout << "Time taken: " << sec << " seconds\n";return 0;
}

打印现在时间:

#include <iostream>
#include <chrono>
#include <iomanip>int main() {// 获取当前时间点auto now = std::chrono::system_clock::now();// 转换为time_t类型,这在C++11中是time_t的高精度版本std::time_t now_time_t = std::chrono::system_clock::to_time_t(now);// 将time_t类型转换为tm结构体,以便于读取和格式化std::tm now_tm;localtime_s(&now_tm, &now_time_t); // 使用localtime_s是安全的,因为localtime_r在某些平台上不可用// 打印当前时间的各个部分std::cout << "Current year: " << 1900 + now_tm.tm_year << std::endl;std::cout << "Current month: " << 1 + now_tm.tm_mon << std::endl;std::cout << "Current day: " << now_tm.tm_mday << std::endl;std::cout << "Current hour: " << now_tm.tm_hour << std::endl;std::cout << "Current minute: " << now_tm.tm_min << std::endl;std::cout << "Current second: " << now_tm.tm_sec << std::endl;// 使用chrono的duration来计算一个小时后的时间auto one_hour_later = now + std::chrono::hours(1);// 计算时间差(以秒为单位)auto time_difference = std::chrono::duration_cast<std::chrono::seconds>(one_hour_later - now);// 格式化当前时间和时间差输出std::cout << "Current time: " << std::put_time(&now_tm, "%Y-%m-%d %H:%M:%S") << std::endl;std::cout << "Time difference: " << time_difference.count() << " seconds" << std::endl;return 0;
}

http://www.ppmy.cn/news/1443411.html

相关文章

C++里的new

C里的new&#xff1a; new开辟的空间在堆上&#xff0c;而一般声明的变量存放在栈上。当在局部函数中new出一段新的空间&#xff0c;该段空间在局部函数调用结束后仍然能够使用&#xff0c;可以用来向主函数传递参数。new出来的是一段空间的首地址。所以一般需要用指针来存放这…

AngularJS中文手册前半部分学习

AngularJS 简介 AngularJS的中文参考手册 AngularJS的使用 AngularJS 是一个JS框架&#xff0c;通过指令(ng-directives)扩展了HTML&#xff0c;且通过表达式绑定数据到HTML&#xff0c;用于开发单一页面应用程序&#xff08;SPAs&#xff1a;Single Page Applications&…

六.音视频编辑-创建视频过渡-概述

引言 目前我的应用已经实现了视频的编辑&#xff0c;音频的混合处理。随着时间的推进&#xff0c;两个不同场景的视频快速的切换&#xff0c;其中没有任何过渡效果。通常画面在时间轴上出现明显的变化时&#xff0c;两个场景间会使用一些动画的过渡效果。比如渐隐&#xff0c;…

Android如何使用XML自定义属性

1、定义 在res/values文件下定义一个attrs.xml文件&#xff0c;代码如下: 2、使用 在布局中使用&#xff0c; 示例代码如下&#xff1a; 3、获取 最终来到这里&#xff1a;

Android Binder——APP中AIDL解析(二十)

上一篇我们最后运行了项目,并完成了跨进成通信。这里我们就来以 getTitleText() 为例分析一下调用流程。 一、调用流程 首先,我们在 bindService 成功回调 onServiceConnected 中,通过 IMyAidlInterface.Stub.asInterface() 获取 Binder 的代理对象。对应方法在 IMyAidlInt…

应用在隔离的IGBT模块中的光电耦合器

IGBT(Insulated Gate Bipolar Transistor)&#xff0c;绝缘栅双极型晶体管&#xff0c;是由BJT(双极型三极管)和MOS(绝缘栅型场效应管)组成的复合全控型电压驱动式功率半导体器件, 兼有MOSFET的高输入阻抗和GTR的低导通压降两方面的优点。GTR饱和压降低&#xff0c;载流密度大&…

人工智能(pytorch)搭建模型28-基于Transformer的端到端目标检测DETR模型的实际应用,DETR的原理与结构

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(pytorch)搭建模型28-基于Transformer的端到端目标检测DETR模型的实际应用&#xff0c;DETR的原理与结构。DETR&#xff08;Detected Transformers&#xff09;是一种基于Transformer的端到端目标检测模型&…

基于微信小程序的旅游系统的设计与实现

基于微信小程序的旅游系统的设计与实现 Design and Implementation of a Tourism System based on WeChat Mini Program 完整下载链接:基于微信小程序的旅游系统的设计与实现 文章目录 基于微信小程序的旅游系统的设计与实现摘要第一章 绪论1.1 研究背景与意义1.2 国内外研究…