当前位置:首页 > 技术分析 > 正文内容

c/c++怎么判断在什么场景下使用哪个系统时间函数?

ruisui883个月前 (02-03)技术分析10

获取时间戳场景

time函数

  • 场景特点:如果只是需要获取从 1970 年 1 月 1 日 00:00:00 UTC到当前时间的秒数作为一个简单的时间标记,用于记录事件发生的顺序、计算时间间隔等基本用途,time函数是一个很好的选择。例如,在一个简单的程序中,记录文件的创建时间和修改时间之间的间隔,只需要获取两个时间戳相减即可。
  • 示例代码:
#include 
#include 
int main() {
    time_t start_time, end_time;
    time(&start_time);
    // 模拟一些操作
    //...
    time(&end_time);
    printf("操作耗时:%ld秒\n", end_time - start_time);
    return 0;
}

时间格式转换场景

localtime和localtime_r函数

  • 场景特点:当需要将时间戳转换为本地时间的日期和时间格式(年、月、日、时、分、秒等)时,localtime系列函数就派上用场了。如果是在单线程环境下,localtime可以正常使用;但如果是多线程环境,为了避免数据竞争,应该使用localtime_r。例如,在一个日志系统中,需要将事件发生的时间戳转换为本地可读的时间格式记录在日志文件中。
  • 示例代码(localtime_r)
#include 
#include 
int main() {
    time_t current_time;
    struct tm local_time;
    time(¤t_time);
    localtime_r(¤t_time, &local_time);
    printf("本地时间:%d-%02d-%02d %02d:%02d:%02d\n",
           local_time.tm_year + 1900, local_time.tm_mon + 1, local_time.tm_mday,
           local_time.tm_hour, local_time.tm_min, local_time.tm_sec);
    return 0;
}

gmtime和gmtime_r函数

  • 场景特点:和localtime系列类似,不过gmtime系列是用于将时间戳转换为格林威治标准时间(GMT)格式。在涉及到跨时区的时间计算、国际标准时间的应用或者需要与全球统一时间标准进行对比的场景下非常有用。同样,在多线程环境下优先使用gmtime_r。例如,在一个网络服务中,需要记录事件发生的全球统一时间。
  • 示例代码(gmtime_r)
#include 
#include 
int main() {
    time_t current_time;
    struct tm gmt_time;
    time(¤t_time);
    gmtime_r(¤t_time, &gmt_time);
    printf("格林威治时间:%d-%02d-%02d %02d:%02d:%02d\n",
           gmt_time.tm_year + 1900, gmt_time.tm_mon + 1, gmt_time.tm_mday,
           gmt_time.tm_hour, gmt_time.tm_min, gmt_time.tm_sec);
    return 0;
}

高精度时间获取场景

gettimeofday函数(Linux 系统)

  • 场景特点:在需要获取高精度时间,包括秒数和微秒数的场景下使用。例如,在性能测试工具中,精确测量一个函数的执行时间到微秒级别,或者在实时性要求较高的系统中,需要更精细的时间控制。不过要注意的是,在一些跨平台应用中,gettimeofday可能不是所有平台都支持。
  • 示例代码:
#include 
#include 
int main() {
    struct timeval tv;
    gettimeofday(&tv, NULL);
    printf("高精度时间:%ld秒 %ld微秒\n", tv.tv_sec, tv.tv_usec);
    return 0;
}

clock_gettime函数(Linux 系统)

  • 场景特点:如果需要更高精度的时间,如纳秒级别,并且可以选择时钟类型(如单调时钟CLOCK_MONOTONIC用于测量时间间隔,不受系统时间调整影响),clock_gettime是合适的函数。在操作系统内核开发、高精度的时间同步系统等场景下经常使用。
  • 示例代码:
#include 
#include 
int main() {
    struct timespec ts;
    clock_gettime(CLOCK_REALTIME, &ts);
    printf("高精度时间(纳秒):%ld秒 %ld纳秒\n", ts.tv_sec, ts.tv_nsec);
    return 0;
}

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/729.html

标签: spec.ts
分享给朋友:

“c/c++怎么判断在什么场景下使用哪个系统时间函数?” 的相关文章

首个支持苹果 M1 Mac 的 Linux 发行版发布,面向用户开放下载

IT之家 3 月 20 日消息,Asahi Linux 是研究 Linux for Apple Silicon macs 的组织群体,3 月 18 日,Asahi Linux 宣布成功在 M1 MacBook Air 笔记本电脑上运行,并开放了 Asahi Linux 的下载安装。Asahi Lin...

代码分支规范

一.gitflow工作流说明:主分支:master,稳定版本代码分支,对外可以随时编译发布的分支,不允许直接Push代码,只能请求合并(pull request),且只接受hotfix、release分支的代码合并。gitlab上做限制。热修复分支:hotfix,针对现场紧急问题、bug修复的代码分...

Python 幕后:Python导入import的工作原理

更多互联网精彩资讯、工作效率提升关注【飞鱼在浪屿】(日更新)Python 最容易被误解的方面其中之一是import。Python 导入系统不仅看起来很复杂。因此,即使文档非常好,它也不能让您全面了解正在发生的事情。唯一方法是研究 Python 执行 import 语句时幕后发生的事情。注意:在这篇文...

vue v-html动态生成的html怎么加样式/事件

1、动态生成的html,样式不生效//html 布局 <view v-html="html"> {{html}} </view> //动态生成的元素 <view class="btngo" @tap="handleLink...

SpringCloudalibaba+Vue开发仿社交小程序-青牛白马七香车

Spring Cloud Alibaba和Vue是当今开发领域中最为流行的技术组合之一。本文将介绍如何使用Spring Cloud Alibaba和Vue开发仿社交小程序。download: https://www.97yrbl.com/t-1632.html项目概述本项目是一个仿社交小程序,包括用...

在vue项目中封装WebSockets请求

在Vue项目中封装WebSocket请求包括以下步骤:1. 安装WebSocket库:首先,导入WebSocket库,例如`vue-native-websocket`或`socket.io-client`。根据项目需求选择适当的库,并根据官方文档进行安装和配置。2. 创建WebSocket服务:在V...