Linux的时间函数

2023年7月19日,周三下午

我今天基于GitHub搭建了自己的博客网站,欢迎大家来我的个人博客网站阅读我的博客

巨龙之路的GitHub个人博客 (julongzhilu.github.io)


目录

  • time
  • 函数原型
  • 使用方法
  • ctime
  • 函数原型
  • 使用方法
  • 疑惑
  • gmtime、 localtime
  • 函数原型
  • 什么是分解时间
  •  使用方法
  • mktime
  • 函数原型
  • 使用方法
  • asctime
  • 函数原型
  • 使用方法
  • strftime
  • 函数原型
  • strftime()的转换说明符集
  • 使用方法
  • strptime
  • 函数原型
  • 使用方法

time

函数原型

获取自 1970 年 1月 1 日早晨零点到现在的秒数,也叫做

#include<time.h>
time_t time(time_t *timep);
使用方法

如果time函数的参数timep为NULL,那么time函数会返回自 1970 年 1月 1 日早晨零点到现在的秒数;

#include<time.h>
#include<stdio.h>
int main(){
    time_t tm;
    tm=time(NULL);
    printf("%d",tm);
}

如果time函数的参数不为NULL,那么time函数会把自 1970 年 1月 1 日早晨零点到现在的秒数赋值给timep指向的time_t类型变量

#include<time.h>
#include<stdio.h>
int main(){
    time_t tm;
    time(&tm);
    printf("%d",tm);
}

建议使用time(NULL),因为这样可以减少出错的可能性,并且使用起来更简单


ctime

函数原型

将time_t转换成可打印格式,所谓可打印格式类似于“Wed Jul 19 01:59:16 2023”

#include<time.h>
char *ctime(const time_t *timep);
使用方法

把一个指向 time_t 的指针作为 timep 参数传入函数 ctime(),将返回一个长达 26 字节的字符串,内含标准格式的日期和时间

#include <stdio.h>
#include <time.h>
​
int main() {
    time_t current_time;
    time(&current_time);
    
    char* time_str = ctime(&current_time);
    printf("Current time: %s", time_str);
    
    return 0;
}
疑惑

为什么ctime函数要用一个指针作为参数,这样不是很麻烦吗?

这是因为ctime函数需要修改一个静态缓冲区中的内容,并返回指向该缓冲区的指针。这个缓冲区包含了一个字符串表示的时间。通过将时间的指针传递给ctime函数,函数可以直接在缓冲区中进行修改,然后返回指向缓冲区的指针,以便用户可以使用这个字符串。

也就是说,通过用指针作为参数,ctime函数就不需要拷贝一份time_t,再根据这副本来修改静态缓冲区的内容,而是可以直接通过指针找到time_t来修改静态缓冲区的内容。这样可以节省内存空间和提高运行效率。

需要注意的是,ctime函数在每次调用时都会使用同一个静态缓冲区,因此如果多次调用ctime函数,后续的调用会覆盖前面调用的结果。如果需要保存多个时间字符串,可以使用localtimegmtime函数进行转换,并使用不同的缓冲区来存储结果。


gmtime、 localtime

函数原型
函数 gmtime() localtime() 可将一 time_t 值转换为一个所谓的分解时间( broken-down
time)。分解时间被置于一个经由静态分配的结构中,其地址则作为函数结果返回。
#include<time.h>

struct tm *gmtime(const time_t *timep);

struct tm *localtime(const time_t *timep);
什么是分解时间

所谓分解时间,其实就是把time_t分解成年、月、日、时、分,秒等

 使用方法
#include<time.h>

int main(){
    time_t ti;
    struct tm *gm_tm;
    struct tm *local_tm;

    //把从1970年1月1日00:00到现在的秒数赋值给ti
    ti=time(NULL);

    //用gmtime函数把ti分解成年、月、日、时、分、秒等,并把分解的结果
    //存放在一个静态分配的结构tm中,返回tm的地址给gm_tm
    gm_tm=gmtime(&ti);

    //用localtime函数把ti分解成年、月、日、时、分、秒等并把分解的结果
    //存放在一个静态分配的结构tm中,返回tm的地址给local_tm
    local_tm=localtime(&ti);

    printf("gm_tm:%d-%d-%d %d:%d:%d\n",gm_tm->tm_year+1900,gm_tm->tm_mon+1,gm_tm->tm_mday,gm_tm->tm_hour,gm_tm->tm_min,gm_tm->tm_sec);
    printf("local_tm:%d-%d-%d %d:%d:%d\n",local_tm->tm_year+1900,local_tm->tm_mon+1,local_tm->tm_mday,local_tm->tm_hour,local_tm->tm_min,local_tm->tm_sec);
}


mktime

函数原型

mktime函数将一个分解时间转换成time_t值

#include<time.h>

time_t mktime(struct tm *timeptr);
使用方法
#include<time.h>
#include<stdio.h>

int main(){

    //获取当前时间的time_t值
    time_t current_time;
    current_time=time(NULL);
    printf("1:current_time:%d\n",current_time);

    //把当前时间的time_t值转换成分解时间
    struct tm *current_tm;
    current_tm=gmtime(&current_time);

    //把分解时间再转换成time_t
    current_time=mktime(current_tm);
    printf("2:current_time:%d\n",current_time);
}


asctime

函数原型

asctime函数把分解时间转换成可打印格式,所谓可打印格式类似于“Wed Jul 19 01:59:16 2023”

#include<time.h>

char *asctime(const struct *timeptr);
使用方法
#include<time.h>
#include<stdio.h>

int main(){
    time_t current_time;
    current_time=time(NULL);

    //获取分解时间
    struct tm *current_tm;
    current_tm=gmtime(&current_time);

    //把分解时间转换成可打印格式
    char* printFormat;
    printFormat=asctime(current_tm);
    printf("%s",printFormat);
}


strftime

函数原型

strftime函数把分解时间转换成指定格式的字符串

#include<time.h>

size_t strftime(char *outstr,size_t maxsize,const char *format,const struct tm *timeptr);
strftime()的转换说明符集
  • %a:缩写的星期几名称(Sun、Mon、Tue等)
  • %A:完整的星期几名称(Sunday、Monday、Tuesday等)
  • %b:缩写的月份名称(Jan、Feb、Mar等)
  • %B:完整的月份名称(January、February、March等)
  • %c:默认的日期和时间表示(例如:Thu Aug 23 14:55:02 2001)
  • %C:世纪数(取值为年份的前两位数字)
  • %d:月份中的日期(01-31)
  • %D:日期(mm/dd/yy)
  • %e:月份中的日期,带有前导空格(1-31)
  • %F:日期(yyyy-mm-dd)
  • %H:小时(00-23)
  • %I:小时(01-12)
  • %j:一年中的天数(001-366)
  • %m:月份(01-12)
  • %M:分钟(00-59)
  • %n:换行符
  • %p:AM或PM
  • %r:12小时制的时间(hh:mm:ss AM/PM)
  • %R:24小时制的时间(hh:mm)
  • %S:秒(00-61)
  • %t:制表符
  • %T:24小时制的时间(hh:mm:ss)
  • %u:星期几(1-7,其中1表示星期一)
  • %U:一年中的周数(00-53,星期天作为每周的第一天)
  • %V:一年中的周数(01-53,ISO 8601标准,星期一作为每周的第一天)
  • %w:星期几(0-6,其中0表示星期天)
  • %W:一年中的周数(00-53,星期一作为每周的第一天)
  • %x:默认的日期表示(例如:08/23/01)
  • %X:默认的时间表示(例如:14:55:02)
  • %y:年份的最后两位数字(00-99)
  • %Y:年份的完整表示(例如:2001)
  • %z:时区偏移(+hhmm或-hhmm)
  • %Z:时区名称
使用方法
#include <stdio.h>
#include <time.h>

int main() {
    time_t now;
    time(&now);
    struct tm* timeinfo = localtime(&now);

    char buffer[80];
    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", timeinfo);
    printf("Formatted date and time: %s\n", buffer);

    return 0;
}


strptime

函数原型

strptime函数按照指定格式把一个时间字符串转换成分解时间

#include<time.h>

char *strptime(const char *str,const char *format,struct tm *timeptr);
使用方法
#include <stdio.h>
#include <time.h>

int main() {
    const char* str = "2022-03-24 10:30:00";
    const char* format = "%Y-%m-%d %H:%M:%S";

    struct tm timeinfo;
    if (strptime(str, format, &timeinfo) != NULL) {
        printf("Year: %d\n", timeinfo.tm_year + 1900);
        printf("Month: %d\n", timeinfo.tm_mon + 1);
        printf("Day: %d\n", timeinfo.tm_mday);
        printf("Hour: %d\n", timeinfo.tm_hour);
        printf("Minute: %d\n", timeinfo.tm_min);
        printf("Second: %d\n", timeinfo.tm_sec);
    } else {
        printf("Failed to parse the string.\n");
    }

    return 0;
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WEB:FlatScience

背景知识 sql注入 SQLite数据库知识 SQLite3注入方法 题目 用dirsearch进行扫描&#xff0c;下面几个关键目录&#xff1a;robots.txt&#xff0c;login.php&#xff0c;admin.php&#xff0c;剩下的目录就是一些pdf格式的论文了 一个一个访问并查看源代码&#xff0c;在查看l…

常用API学习06(Java)

Biglnteger public BigInteger(int num, Random rnd) 获取随机大整数&#xff0c;范围&#xff1a;[0~2的num次方-1] public BigInteger(String val) 获取指定的大整数 public BigInteger(String val, int radix) 获取指定进制的大整数 public static BigInteg…

怎么给pdf文件加密?pdf文档如何加密

在数字化时代&#xff0c;保护个人和机密信息的重要性越来越受到关注。PDF&#xff08;Portable Document Format&#xff09;是一种广泛使用的文件格式&#xff0c;用于共享和存储各种类型的文档。然而&#xff0c;由于其易于编辑和复制的特性&#xff0c;保护PDF文件中的敏感…

一张表实现短视频“评论区“完整功能

前言 现如今&#xff0c;不管是哪种类型的应用&#xff0c;评论区都少不了。从工具类的到媒体信息流类的&#xff0c;评论留言都是最基本的互动环节。比如抖音短视频下&#xff0c;针对视频每个用户都可以发表自己的观点&#xff1b;而针对用户的评论&#xff0c;其他的用户又可…

Spring Cloud—GateWay之限流

RequestRateLimiter RequestRateLimiter GatewayFilter 工厂使用 RateLimiter 实现来确定是否允许当前请求继续进行。如果不允许&#xff0c;就会返回 HTTP 429 - Too Many Requests&#xff08;默认&#xff09;的状态。 这个过滤器需要一个可选的 keyResolver 参数和特定于…

Spring @RequestMapping 工作原理

Spring RequestMapping 工作原理 配置基础启动类及Controller类 SpringBootApplication public class DemoServiceApplication {public static void main(String[] args) {SpringApplication.run(DemoServiceApplication.class, args);} }RestController public class HelloC…

单元测试用例到底该如何设计?

目录 前言 使用参数方法创建测试用例 使用执行路径方法创建测试用例 总结 前言 最近一些大公司在进行去测试化的操作&#xff0c;这一切的根源大概可以从几年前微软一刀切砍掉所有内部正式的测试人员开始说起&#xff0c;当时微软内部的测试工程师有一部分转职成了开发工程…

【数据结构常见七大排序(三)上】—交换排序篇【冒泡排序】And【快速排序】

目录 前言 1.冒泡排序 1.1冒泡排序动图 1.2冒泡排序源代码 1.3冒泡排序的特性总结 2.快速排序&#x1f451; 2.1hoare版本实现思想 排序前 排序中 排序后 2.2hoare版本快排源代码 2.3分析先走 情况1&#x1f947; 情况2&#x1f948; 前言 交换类排序两个常见的排…

嵌入式工程师常用的软件工具推荐

前言&#xff1a;常言道&#xff1a;工欲善其事&#xff0c;必先利其器。作为一名合格的嵌入式工程师&#xff0c;日常可能需要接触和处理各种奇奇怪怪的问题&#xff0c;这时候一款高适配性的工具将会令工作效率大大提升。作者根据个人的实际使用情况与粉丝的客观感受&#xf…

紧跟国家“新能源+”模式!涂鸦智慧能源方案助力夏季用电节能提效

“今天的你是几分熟&#xff1f;” 今年夏天&#xff0c;高温来得比往年更早&#xff0c;五六月份就提前开启了滚滚热浪模式&#xff0c;京津冀和山东等地最高气温也一度突破了历史极值。在提前到来的高温“烤”验下&#xff0c;全社会供电能力面临着极大挑战。 中国电力网预…

完整的电商平台后端API开发总结

对于开发一个Web项目来说&#xff0c;无论是电商还是其他品类的项目&#xff0c;注册与登录模块都是必不可少的&#xff1b;注册登录功能也是我们在日常生活中最长接触的&#xff0c;对于这个业务场景的需求与逻辑大概是没有什么需要详细介绍的&#xff0c;市面上常见的邮箱注册…

PSP - Jackhmmer 搜索 EMBL 序列数据库的相似序列

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131817060 EMBL (European Molecular Biology Laboratory&#xff0c;欧洲分子生物实验室)&#xff1a;EMBL 数据库是一个由欧洲生物信息学研究所…

第六届字节跳动青训营报录比(宣传大使)

统计 前端基础卷&#xff1a;105 前端基础班&#xff1a;120-22(笔试不过基础班&#xff0c;宣传大使奖励进入&#xff09;98 前端进阶卷&#xff1a;77 前端进阶班&#xff1a;18-216 后端基础卷&#xff1a;151 后端基础班&#xff1a;220 后端进阶卷&#xff1a;133 后端进…

LeetCode·每日一题·1851. 包含每个查询的最小区间·优先队列(小顶堆)

题目 示例 思路 离线查询&#xff1a; 输入的结果数组queries[]是无序的。如果我们按照输入的queries[]本身的顺序逐个查看&#xff0c;时间复杂度会比较高。 于是&#xff0c;我们将queries[]数组按照数值大小&#xff0c;由小到大逐个查询&#xff0c;这种方法称之为离线查询…

《微服务架构设计模式》第十二章 部署微服务应用

内容总结自《微服务架构设计模式》 部署微服务应用 一、部署模式分类二、编程语言特定的发布包格式1、概述2、利弊 三、将服务部署为虚拟机1、概览2、利弊 四、将服务部署为容器1、概述2、利弊3、K8S部署 五、Serverless部署1、概述2、利弊3、示例 六、总结 一、部署模式分类 …

视频融合平台EasyCVR级联后上级平台播放失败的问题排查与优化

EasyCVR视频融合平台基于云边端智能协同架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;平台可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、云台控制等视频能力与服务&#xff0c;可支持多协议、多类型的海量设备接入与分发。 …

7、PHP语法要点2

1、or 和 ||&#xff0c;&& 和 and 都是逻辑运算符&#xff0c;效果一样&#xff0c;但是其优先级却不一样。&&、||的优先级在赋值运算符之前&#xff0c;or和and在赋值运算符之后。 2、字符串变量及数组可以在echo输出时双引号内、双引号外均可引用&#xff…

Meta提出全新参数高效微调方案,仅需一个RNN,Transformer模型GPU使用量减少84%!

近来&#xff0c;随着ChatGPT和GPT-4模型的不断发展&#xff0c;国内外互联网大厂纷纷推出了自家的大语言模型&#xff0c;例如谷歌的PaLM系列&#xff0c;MetaAI的LLaMA系列&#xff0c;还有国内公司和高校推出的一些大模型&#xff0c;例如百度的文心一言&#xff0c;清华的C…

迅镭激光赋能工程机械,客户连续复购激光加工设备达双赢!

工程机械是装备制造业的重要组成部分&#xff0c;当前&#xff0c;我国已成为门类齐全、规模庞大、基础坚实、竞争力强的工程机械设备制造大国。 随着工程机械产业正在全面向智能化、绿色化转型&#xff0c;激光加工成为推动工程机械产业转型升级的重要工具&#xff0c;越来越多…

CS162 11-12 调度与死锁

调度 overview 1.FCFS 可以利用好cache缓存&#xff0c;减少上下文切换。 2.很直观&#xff0c;贪心&#xff0c;可以减少平均的响应时间 3 4. 5.等待调度的时间是平均的 6.优先级翻转&#xff0c;和优先级捐赠 解决 cfs中的调度 死锁 四个必要不充分条件 银行家算法&…