C语言编程中的时间处理

最简单的time

在C语言编程中,处理时间最简单的函数就是time了。它的原型为:

#include <time.h>  time_t time(time_t *_Nullable tloc);

返回自从EPOCH,即1970年1月1日的零点零时零分,到当前的秒数。

输入参数可以是NULL。如果输入参数不是NULL,那么返回值也会存入tloc的地址处。

需要注意的是,在不同的平台上,这里的time_t定义可能不同。

glibc-devel-2.41中,/usr/include/bits/types/time_t.h中有如下定义:

 #include <bits/types.h>5 6 /* Returned by `time'.  */7 #ifdef __USE_TIME64_REDIRECTS8 typedef __time64_t time_t;9 #else10 typedef __time_t time_t;11 #endif

__time64_t__time_t的定义则如下:

__STD_TYPE __TIME64_T_TYPE __time64_t;__STD_TYPE __TIME_T_TYPE __time_t;      /* Seconds since the Epoch.  */

再继续跟下去,涉及到各种宏等分支,最终的定义在Fedora 42的X86_64平台上,这个值是long int。

Linux中的gettimeofday/settimeofday

time简单,但是也粗糙,它只能取到秒这个单位。而gettimeofday则可能取到微秒。

与之相对,settimeofday则可以设置系统时间。

gettimeofday/settimeofday的原型如下:

       #include <sys/time.h>int gettimeofday(struct timeval *restrict tv,struct timezone *_Nullable restrict tz);int settimeofday(const struct timeval *tv,const struct timezone *_Nullable tz);

struct timeval的定义为:

          struct timeval {  time_t      tv_sec;     /* seconds */  suseconds_t tv_usec;    /* microseconds */  };

tv_sec就是秒数,tv_usec是微秒。

struct timezone的定义为:

          struct timezone {  int tz_minuteswest;     /* minutes west of Greenwich */  int tz_dsttime;         /* type of DST correction */  };

当执行gettimeofday之后,返回0表示成功,非0表示失败。

需要注意的是,tz这个结构已经过时,在我们使用gettimeofday与settimeofday的时候,直接把tz设为NULL,取得或者设置当前的本地时间就好了。

Windows中的GetLocalTime/SetLocalTime

在Windows环境下,取得与设置时间,可以使用GetLocalTime与SetLocalTime函数。

这两个函数的原型如下:

void GetLocalTime([out] LPSYSTEMTIME lpSystemTime
);BOOL SetLocalTime([in] const SYSTEMTIME *lpSystemTime
);

相关的数据结构定义如下:

typedef struct _SYSTEMTIME {WORD wYear;WORD wMonth;WORD wDayOfWeek;WORD wDay;WORD wHour;WORD wMinute;WORD wSecond;WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;

其中:
wYear

年数,范围是从1601到30872。

mMonth

月数,范围是从1到12。

mDayOfWeek

周偏移数,范围是从0到6。

wDay

天数,范围是从 1 到 31。

wHour

小时数,范围是从 0 到 23。

wMinute

分钟数,范围是从 0 到 59。

wSecond

秒数,范围是从 0 到 59。

wMilliseconds

毫秒数,范围是从 0 到 999。

还需要注意,SetLocalTime的返回值是布尔值,成功为非0。

以下代码,把一个从Linux取得的timeval时间,转化成Windows上的时间,进行设置:

int set_local_time_by_timeval (const struct timeval *tv)
{struct tm utc_tm;SYSTEMTIME st = { 0 };   if (localtime_s (&utc_tm, &tv->tv_sec) != 0)  {    return -1;}  st.wYear = utc_tm.tm_year + 1900;  st.wMonth = utc_tm.tm_mon + 1;  st.wDay = utc_tm.tm_mday;  st.wHour = utc_tm.tm_hour;  st.wMinute = utc_tm.tm_min;  st.wSecond = utc_tm.tm_sec;  st.wMilliseconds = (WORD)(time % (1000 * 1000) / 1000);  return SetLocalTime (&st) ? 0 : -1;

glib里的g_get_monotonic_time

如果我们的项目使用了glib(注意是glib,不是glibc),还有一个方便的函数可以使用,那就是g_get_monotonic_time

这个函数表示系统启动以来经过的微秒数,用来做一些时间间隔设计等工作。

比如,我们需要开发一些timer类功能,在程序经过若干时间之后,执行什么操作,如果使用time或者gettimeofday之类的函数,在系统时间改变之后,就会错乱。

但是,如果我们使用g_get_monotonic_time则可以完全避免这种问题。

如:

gint64 start = g_get_monotonic_time();/* 此处是需要测量的业务代码 */
/* 而且有可能系统时间更改 */gint64 end = g_get_monotonic_time();
g_print("耗时: %" G_GINT64_FORMAT " 微秒\n", end - start);

glib的这个函数有点像C++中的std::chrono::steady_clock

底层的clock_gettime

如果进行更精确地时间控制,在Linux中还可以使用clock族的几个函数:

    #include <time.h>  int clock_getres(clockid_t clockid, struct timespec *_Nullable res);  int clock_gettime(clockid_t clockid, struct timespec *tp);  int clock_settime(clockid_t clockid, const struct timespec *tp);

其中,clockid是可以控制的一些参数,如CLOCK_MONOTONIC、CLOCK_BOOTTIME、CLOCK_REALTIME等,具体意义可以见文知义。

而timespec的定义类似于timeval,但是第二个参数不是微秒,而是纳秒。

      #include <time.h>  struct timespec {  time_t     tv_sec;   /* Seconds */  /* ... */   tv_nsec;  /* Nanoseconds [0, 999'999'999] */  };

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/83411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

适应性神经树:当深度学习遇上决策树的“生长法则”

1st author: Ryutaro Tanno video: Video from London ML meetup paper: Adaptive Neural Trees ICML 2019 code: rtanno21609/AdaptiveNeuralTrees: Adaptive Neural Trees 背景 在机器学习领域&#xff0c;神经网络&#xff08;NNs&#xff09;凭借其强大的表示学习能力&…

InitVerse节点部署教程

项目介绍: InitVerse 是一个为新兴企业量身定制的自动化 Web3 SaaS 平台,只需单击几下即可快速开发和部署 DApp。在 INIChain 和 INICloud 的支持下,InitVerse 可以根据需求动态调整计算资源,实现高效的任务处理,同时提供更高的安全性、可用性和可扩展性。 系统要求: C…

阿里开源通义万相 Wan2.1-VACE,开启视频创作新时代

0.前言 阿里巴巴于2025年5月14日正式开源了其最新的AI视频生成与编辑模型——通义万相Wan2.1-VACE。这一模型是业界功能最全面的视频生成与编辑工具&#xff0c;能够同时支持多种视频生成和编辑任务&#xff0c;包括文生视频、图像参考视频生成、视频重绘、局部编辑、背景延展…

解决“VMware另一个程序已锁定文件的一部分,进程无法访问“

问题描述 打开VMware里的虚拟机时&#xff0c;弹出"另一个程序已锁定文件的一部分&#xff0c;进程无法访问"如图所示&#xff1a; 这是VM虚拟机的保护机制。虚拟机运行时&#xff0c;为防止数据被篡改&#xff0c;会将所运行的文件保护起来。当虚拟机崩溃或者强制…

基于大数据的租房信息可视化系统的设计与实现【源码+文档+部署】

课题名称 基于大数据的租房信息可视化系统的设计与实现 学 院 专 业 计算机科学与技术 学生姓名 指导教师 一、课题来源及意义 租房市场一直是社会关注的热点问题。随着城市化进程的加速&#xff0c;大量人口涌入城市&#xff0c;导致租房需求激增。传统的租…

Vue3封装公共图片组件

对图片加载做的处理: 图片加载状态响应式管理图片访问错误的处理机制图片懒加载可通过slot支持自定义加载动画其他监听事件的处理及向上传递 …<!-- components/CustomImage.vue --> <template><div class="custom-image-wrapper"><!-- 主图 -…

车道线检测----CLRKDNet

今天的最后一篇 车道线检测系列结束 CLRKDNet&#xff1a;通过知识蒸馏加速车道检测 摘要&#xff1a;道路车道是智能车辆视觉感知系统的重要组成部分&#xff0c;在安全导航中发挥着关键作用。在车道检测任务中&#xff0c;平衡精度与实时性能至关重要&#xff0c;但现有方法…

Python-感知机以及实现感知机

感知机定义 如果有一个算法&#xff0c;具有1个或者多个入参&#xff0c;但是返回值要么是0&#xff0c;要么是1&#xff0c;那么这个算法就叫做感知机&#xff0c;也就是说&#xff0c;感知机是个算法 感知机有什么用 感知机是用来表示可能性的大小的&#xff0c;我们可以认…

STM32 ADC+DMA+TIM触发采样实战:避坑指南与源码解析

知识点1【TRGO的介绍】 1、TRGO的概述 TRGO&#xff1a;Trigger Output&#xff08;触发输出&#xff09;&#xff0c;是定时器的一种功能。 它可以作为外设的启动信号&#xff0c;比如ADC转换&#xff0c;DAC输出&#xff0c;DMA请求等。 对于ADC来说&#xff0c;可以通过…

Qwen3技术报告解读

https://github.com/QwenLM/Qwen3/blob/main/Qwen3_Technical_Report.pdf 节前放模型&#xff0c;大晚上的发技术报告。通义&#xff0c;真有你的~ 文章目录 预训练后训练Long-CoT Cold StartReasoning RLThinking Mode FusionGeneral RLStrong-to-Weak Distillation 模型结构…

【网络编程】十、详解 UDP 协议

文章目录 Ⅰ. 传输层概述1、进程之间的通信2、再谈端口号端口号的引出五元组标识一个通信端口号范围划分常见的知名端口号查看知名端口号协议号 VS 端口号 3、两个问题一个端口号是否可以被多个进程绑定&#xff1f;一个进程是否可以绑定多个端口号&#xff1f; 4、部分常见指令…

实现RTSP低延迟播放器,挑战与解决方案

随着低延迟直播需求的快速增长&#xff0c;RTSP&#xff08;Real-Time Streaming Protocol&#xff09;播放器逐渐成为实时视频流传输中的核心技术之一。与WebRTC&#xff08;Web Real-Time Communication&#xff09;相比&#xff0c;RTSP在实时性和网络延迟方面面临诸多挑战&…

【springcloud学习(dalston.sr1)】Eureka单个服务端的搭建(含源代码)(三)

该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍&#xff08;含源代码&#xff09;&#xff08;一&#xff09; springcloud学习&#xff08;dalston.sr1&#xff09;系统文章汇总如下&#xff1a; 【springcloud学习(dalston…

GPU与NPU异构计算任务划分算法研究:基于强化学习的Transformer负载均衡实践

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 引言 在边缘计算与AI推理场景中&#xff0c;GPU-NPU异构计算架构已成为突破算力瓶颈的关键技…

探索C语言中的二叉树:原理、实现与应用

一、引言 二叉树作为一种重要的数据结构&#xff0c;在计算机科学领域有着广泛的应用&#xff0c;无论是在操作系统的文件系统管理&#xff0c;还是在数据库的索引构建中&#xff0c;都能看到它的身影。在C语言中&#xff0c;我们可以利用指针灵活地构建和操作二叉树。接下来&…

使用libUSB-win32的简单读写例程参考

USB上位机程序的编写&#xff0c;函数的调用过程. 调用 void usb_init(void); 进行初始化 调用usb_find_busses、usb_find_devices和usb_get_busses这三个函数&#xff0c;获得已找到的USB总线序列&#xff1b;然后通过链表遍历所有的USB设备&#xff0c;根据已知的要打开USB设…

vue注册用户使用v-model实现数据双向绑定

定义数据模型 Login.vue //定义数据模型 const registerData ref({username: ,password: ,confirmPassword: })使用 v-model 实现数据模型的key与注册表单中的元素之间的双向绑定 <!-- 注册表单 --><el-form ref"form" size"large" autocompl…

【Arthas实战】常见使用场景与命令分享

简介: Arthas是一款Java诊断工具&#xff0c;适用于多种场景&#xff0c;如接口响应变慢、CPU占用过高、热更新需求等。其核心命令包括实时监控面板&#xff08;dashboard&#xff09;、线程状态查看&#xff08;thread&#xff09;、方法调用链路追踪&#xff08;trace&#x…

Jenkins 最佳实践

1. 在Jenkins中避免调度过载 过载Jenkins以同时运行多个作业可能导致资源竞争、构建速度变慢和系统性能问题。分配作业启动时间可以防止瓶颈&#xff0c;并确保更顺畅的执行。如何实现&#xff1f; 在Cron表达式中使用H&#xff1a;引入抖动&#xff08;jitter&#xff09;&a…

pytest框架 - 第二集 allure报告

一、断言assert 二、Pytest 结合 allure-pytest 插件生成美观的 Allure 报告 (1) 安装 allure 环境 安装 allure-pytest 插件&#xff1a;pip install allure-pytest在 github 下载 allure 报告文件 地址&#xff1a;Releases allure-framework/allure2 GitHub下载&#x…