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

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

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

获取时间戳场景

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++怎么判断在什么场景下使用哪个系统时间函数?” 的相关文章

vue:组件中之间的传值

一、父子组件之间的传值----props/$emit1、父组件向子组件传值--props2.子组件想父组件传值-this.$emit('select',item)二、父组件向下(深层)子组件传值----provide/injectprovide:Object | () => O...

Vue3,父组件子组件传值,provide(提供)和inject(注入)传值

父组件向子组件传值父子组件传递数据时,通常使用的是props和emit,父向子传递使用props,子向父传递使用emit。子组件接收3种方式// 1、简单接收 props:["title","isShow"], // 2、接收的同时对数据类型进行限制 props:{...

美国民众负债累累 但今年假期消费者支出仍将创下新高

智通财经APP获悉,在迎接假期之际,许多美国人已经背负了创纪录的信用卡债务。然而,今年假期消费者支出仍将创下新高。根据美国零售联合会(NRF)上周发布的报告,预计今年11月1日至12月31日期间的消费总额将达到创纪录的9795亿至9890亿美元之间。NRF首席经济学家Jack Kleinhenz表示...

双子座应用程序推出模型切换器以在Android上访问2.0

#头条精品计划# 快速导读谷歌推出了Gemini 2.0 Flash实验版,现已在其安卓应用中可用,之前仅在gemini.google.com网站上提供。新版本的15.50包含模型切换器,用户可以在设置中选择不同模型,包括1.5 Pro、1.5 Flash和2.0 Flash实验版。谷歌提醒,2.0...

Gemini应用在Android上广泛推出2.0闪电模式切换器

#头条精品计划# 快速导读谷歌(搜索)应用的测试频道在安卓设备的双子应用中推出了2.0闪电实验功能,现已向稳定用户开放。双子应用通过谷歌应用运行,目前推出的15.50版本中,用户可通过模型选择器体验不同选项,包括1.5专业版、1.5闪电版和2.0闪电实验版。2.0闪电实验模型提供了更快的响应速度和优...

Vue进阶(幺叁捌):vue路由传参的几种基本方式

1、动态路由(页面刷新数据不丢失)methods:{ insurance(id) { //直接调用$router.push 实现携带参数的跳转 this.$router.push({ path: `/particulars/${id}`,...