linux有计算时间的函数,例如:可获取秒级时间差的函数time()、可获取微秒级时间差的函数gettimeofday()和settimeofday()、可获取纳秒级时间差的函数clock_gettime()等等。
本教程操作环境:linux7.3系统、Dell G3电脑。
下面讲解的是linux中 时间相关的函数和将时间转换相关函数
1.获取时间相关函数
1.1 获取秒级时间差函数
#include <time.h> time_t time(time_t *timer);//通过函数返回值或者timer 变量均可以获取到当前时间
time_t实际上是一个长整型,表示UTC时间(1970年1月1日0时0分0秒,Linux系统的Epoch时间)到当前系统时间的秒数级时间差
1.2 获取微秒级时间差函数
#include <sys/time.h> #include <unistd.h> struct timeval { time_t tv_sec; /* seconds */ suseconds_t tv_usec; /* microseconds */ }; struct timezone{ int tz_minuteswest; /*miniutes west of Greenwich*/ int tz_dsttime; /*type of DST correction*/ }; //函数执行成功返回0,失败返回-1. 其中timezone 是时区相关的结构体 int gettimeofday(struct timeval *tv, struct timezone *tz); //用来设置制定的时间和时区信息 int settimeofday(const struct timeval *tv, const struct timezone *gz);
1.3获取纳秒级时间差函数
#include <time.h> /* 其中clk_id 用来制定对应的时钟类型,不同的类型可以用来获取不同的时间值,具体有四种: CLOCK_REALTIME: 系统实时时间,从UTC开始计时,若时间被用户更改计数时间相应改变; CLOCK_MONOTONIC: 从系统启动开始计时,即使用户更改时间也没有影响; CLOCK_PROCESS_CPUTIME_ID: 本进程开始到执行到当前程序系统CPU花费的时间; CLOCK_THREAD_CPUTIME_ID: 本线程开始到执行到当前程序系统CPU花费的时间 */ struct timespec{ time_t tv_sec; //s long tv_nsec; //ns }; int clock_gettime(clockid_t clk_id, struct timespec* tp);
2.转换时间相关函数
2.1将上述获取时间函数获取到的时间参数time_t转换为结构体
struct tm,该结构体包含年月日等非常详细的域。下如所示:
#include <time.h> struct tm{ int tm_sec; //秒 int tm_min; //分 int tm_hour; //时;取值区间为[0, 23] int tm_mday; //日;取值区间为[1, 31] int tm_mon; //月份;取值区间为[0, 11]; 0表示1月份依次递增到12月份 int tm_year; //年份;其值为1900年至今年数 int tm_wday; //星期;0代表星期天,1代表星期1,以此类推 int tm_yday; //日期;0代表1月1日 int tm_isdst; //夏令时标识符;使用夏令时为正,不使用t为0,不确定时为负*/ };
将time_t转换成struct tm结构体常用的函数如下:
#include <time.h> struct tm* gmtime(const time_t* timep); struct tm*localtime(const time_t* timep);
gmtime() 和localtime() 函数可以将time_t 数据格式转化成tm格式的类型。区别是gmtime()转换的结果是GMT(中央时区)对应的信息,而localtime() 函数转换的结果是当前所在时区的信息。
2.2将time_t转换成我们习惯性使用的时间和日期字符串
对应转换函数如下:
#include <time.h> char* ctime(time_t* timep);
2.3 将struct tm 转换成 time_t
对应函数如下:
#include <time.h> time_t mktime(struct tm *p_tm);
2.4将struct tm转换成我们习惯性使用的时间和日期字符串
对应函数如下:
#include <time.h> char *asctime(const struct tm *p_tm); //习惯性字符串 Thu Dec 9 07:13:35 2021
2.5 将时间字符串转换成 struct tm格式
/************************************** ** description: 将struct tm 按照指定的format格式转化成字符串 ** parameter: ** *s : 需要被转换的时间字符串 ** *format:时间字符串的格式 ** *tm:转换后的tm时间 **************************************/ char *strptime(const char *s, const char *format, struct tm *tm);
2.6 将struct tm 按照指定的format格式转化成字符串
/************************************** ** description: 将struct tm 按照指定的format格式转化成字符串 ** parameter: ** *s : 生成的时间字符串 ** max: 字符串最大字符数(即最大可生成的字符数量) ** *format:生成的字符串格式 ** *tm:需要被转换的tm时间 **************************************/ size_t strftime(char *s, size_t max, const char *format,const struct tm *tm);
3.举例
#include <stdio.h> #include <string.h> #include <unistd.h> #include <time.h> #include <sys/time.h> int main(int argc, char *argv[]) { char *pstr = NULL; struct tm *ptm = NULL; printf("************** 使用ctime获取时间time_t **************\n"); time_t times = 0; time(×); printf("time_t:%ld\n\n", times); printf("************** 使用ctime转换time_t成我们习惯性使用的时间和日期字符串 **************\n"); pstr = ctime(×); printf("ctime:%s\n", pstr); printf("************** 使用gmtime转换time_t成struct tm 时间和日期**************\n"); ptm = gmtime(×); printf("time : %d:%d:%d\n", ptm->tm_hour, ptm->tm_min, ptm->tm_sec); printf("date: %d:%d:%d\n", ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday); printf("year: wday:%d yday:%d isdst:%d\n\n", ptm->tm_wday, ptm->tm_yday, ptm->tm_isdst); printf("************** 使用asctime转换struct tm成我们习惯性使用的时间和日期字符串**************\n"); pstr = asctime(ptm); printf("asctime:%s\n\n", pstr); printf("************** 使用localtime转换time_t成struct tm 时间和日期**************\n"); ptm = localtime(×); printf("time : %d:%d:%d\n", ptm->tm_hour, ptm->tm_min, ptm->tm_sec); printf("date: %d:%d:%d\n", ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday); printf("year: wday:%d yday:%d isdst:%d\n", ptm->tm_wday, ptm->tm_yday, ptm->tm_isdst); pstr = asctime(ptm); printf("asctime:%s\n\n", pstr); printf("************** 使用gettimeofday获取微秒级的时间**************\n"); struct timeval tv; struct timezone tz; gettimeofday(&tv, &tz); ptm = localtime(&tv.tv_sec); printf("time : %d:%d:%d\n", ptm->tm_hour, ptm->tm_min, ptm->tm_sec); printf("date: %d:%d:%d\n", ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday); printf("year: wday:%d yday:%d isdst:%d\n", ptm->tm_wday, ptm->tm_yday, ptm->tm_isdst); printf("tv_usec:%ld\n\n", tv.tv_usec); printf("************** 使用clock_gettime获取纳秒级的时间**************\n"); struct timespec tp; clock_gettime(CLOCK_REALTIME, &tp); ptm = localtime(&tp.tv_sec); printf("time : %d:%d:%d\n", ptm->tm_hour, ptm->tm_min, ptm->tm_sec); printf("date: %d:%d:%d\n", ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday); printf("year: wday:%d yday:%d isdst:%d\n", ptm->tm_wday, ptm->tm_yday, ptm->tm_isdst); printf("tp.tv_nsec:%ld\n\n", tp.tv_nsec); return 0; }
特定的时间字符相互转换
int str_to_time(void) { char pstr[128] = {0}; struct tm t; strptime("2021-04-23 12:34:56", "%Y-%m-%d %H:%M:%S", &t); printf("**** tm_isdst: %d, tm_yday:%d, tm_wday%d,\n %d-%d-%d \n %d:%d:%d\n", t.tm_isdst, t.tm_yday, t.tm_wday, t.tm_year+1900, t.tm_mon+1, t.tm_mday, t.tm_hour, t.tm_min, t.tm_sec); printf("mktime ts:%ld\n", mktime(&t)); printf("asctime:%s\n", asctime(&t)); strftime(pstr, sizeof(pstr), "%Y-%m-%d %H:%M:%S", &t); printf("pstr:%s\n", pstr); } int time_to_str(void) { char pstr[128] = {0}; struct tm t = { .tm_sec = 56, /* Seconds (0-60) */ .tm_min = 34, /* Minutes (0-59) */ .tm_hour = 12, /* Hours (0-23) */ .tm_mday = 23, /* Day of the month (1-31) */ .tm_mon = 4-1, /* Month (0-11) */ .tm_year = 2021-1900, /* Year - 1900 */ .tm_wday = 5, /* Day of the week (0-6, Sunday = 0) */ .tm_yday = 113, /* Day in the year (0-365, 1 Jan = 0) */ .tm_isdst = 0, /* Daylight saving time */ }; strftime(pstr, sizeof(pstr), "%Y-%m-%d %H:%M:%S", &t); printf("pstr:%s\n", pstr); }
若想获取从系统启动开始计时,即使用户更改时间也没有影响的时间,单位毫秒,举例如下:
unsigned long long clock_systick_get(void) { int ret = -1; unsigned long long time; int cnt = 0; struct timespec now = {0, 0}; while (ret < 0 && cnt < 3) { ret = clock_gettime(CLOCK_MONOTONIC, &now); //获取失败重试,最大执行3次 cnt++; } time = now.tv_sec * 1000 + now.tv_nsec / (1000000); return time; }
相关推荐:《Linux视频教程》
以上是linux有计算时间的函数吗的详细内容。更多信息请关注PHP中文网其他相关文章!

Linux的维护模式可以通过GRUB菜单进入,具体步骤为:1)在GRUB菜单中选择内核并按'e'编辑,2)在'linux'行末添加'single'或'1',3)按Ctrl X启动。维护模式提供了一个安全环境,适用于系统修复、重置密码和系统升级等任务。

进入Linux恢复模式的步骤是:1.重启系统并按特定键进入GRUB菜单;2.选择带有(recoverymode)的选项;3.在恢复模式菜单中选择操作,如fsck或root。恢复模式允许你以单用户模式启动系统,进行文件系统检查和修复、编辑配置文件等操作,帮助解决系统问题。

Linux的核心组件包括内核、文件系统、Shell和常用工具。1.内核管理硬件资源并提供基本服务。2.文件系统组织和存储数据。3.Shell是用户与系统交互的接口。4.常用工具帮助完成日常任务。

Linux的基本结构包括内核、文件系统和Shell。1)内核管理硬件资源,使用uname-r查看版本。2)EXT4文件系统支持大文件和日志,使用mkfs.ext4创建。3)Shell如Bash提供命令行交互,使用ls-l列出文件。

Linux系统管理和维护的关键步骤包括:1)掌握基础知识,如文件系统结构和用户管理;2)进行系统监控与资源管理,使用top、htop等工具;3)利用系统日志进行故障排查,借助journalctl等工具;4)编写自动化脚本和任务调度,使用cron工具;5)实施安全管理与防护,通过iptables配置防火墙;6)进行性能优化与最佳实践,调整内核参数和养成良好习惯。

Linux维护模式通过在启动时添加init=/bin/bash或single参数进入。1.进入维护模式:编辑GRUB菜单,添加启动参数。2.重新挂载文件系统为读写模式:mount-oremount,rw/。3.修复文件系统:使用fsck命令,如fsck/dev/sda1。4.备份数据并谨慎操作,避免数据丢失。

本文探讨如何在Debian系统上提升Hadoop数据处理效率。优化策略涵盖硬件升级、操作系统参数调整、Hadoop配置修改以及高效算法和工具的运用。一、硬件资源强化确保所有节点硬件配置一致,尤其关注CPU、内存和网络设备性能。选择高性能硬件组件对于提升整体处理速度至关重要。二、操作系统调优文件描述符和网络连接数:修改/etc/security/limits.conf文件,增加系统允许同时打开的文件描述符和网络连接数上限。JVM参数调整:在hadoop-env.sh文件中调整

本指南将指导您学习如何在Debian系统中使用Syslog。Syslog是Linux系统中用于记录系统和应用程序日志消息的关键服务,它帮助管理员监控和分析系统活动,从而快速识别并解决问题。一、Syslog基础知识Syslog的核心功能包括:集中收集和管理日志消息;支持多种日志输出格式和目标位置(例如文件或网络);提供实时日志查看和过滤功能。二、安装和配置Syslog(使用Rsyslog)Debian系统默认使用Rsyslog。您可以通过以下命令安装:sudoaptupdatesud


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3 Linux新版
SublimeText3 Linux最新版

SublimeText3汉化版
中文版,非常好用

Atom编辑器mac版下载
最流行的的开源编辑器

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)