Linux的时间函数

2023-10-26

2023年7月19日,周三下午

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

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


目录


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;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux的时间函数 的相关文章

  • CMake:不要为链接中使用的单个库设置 rpath

    我想要做的是配置我的 CMakeLists 文件 以便在构建我的项目时 链接器使用驻留在我的构建树中的共享库 so 的副本来链接可执行文件 但不会在中设置 rpath链接的可执行文件 以便系统必须在加载程序请求时提供该库 具体来说 我想在构
  • Bash 变量:区分大小写?

    Bash shell 脚本区分大小写吗 是可变的date与DATE 是的 它区分大小写 就像 UNIX 的其余部分一样 date and DATE是两个不同的变量 makefile and Makefile是两个不同的文件 h and H是
  • 将尾部输出重定向到程序中

    我想使用 tail 作为标准输入向程序发送文本文件中的最新行 首先 我向程序回显一些每次都相同的输入 然后从输入文件发送尾部输入 该输入文件应首先通过 sed 处理 以下是我期望工作的命令行 但是当程序运行时 它只接收回显输入 而不接收尾部
  • Linux 中不使用 C++ 的 C 异常处理

    Linux 是否提供了 C 语言的异常处理而不求助于 C 或者 实现此类异常处理的最佳方法是什么 目标是避免检查每个调用的函数的返回码 而是执行类似于 C 的线程安全且易于移植的操作 您可以通过为其编写信号处理程序来处理信号 GNU 记录的
  • 从命令输出中设置 GDB 中的环境变量

    我试图在挑战中利用缓冲区溢出 缓冲区从环境变量中获取其值 在 GDB 中 我知道您可以使用以下命令设置环境变量 set environment username test 但是我需要传递用户名变量特殊字符 所以我需要执行以下操作 set e
  • 如何在Linux中打开端口[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我已经安装了 Web 应用程序 该应用程序在 RHEL centOS 上的端口 8080 上运行 我只能通过命令行访问该机器 我尝试从我的
  • 将 -1 作为文件描述符传递给 mmap

    我对 FC17 Linux 中的 ls 命令进行了 strace 以下是输出 execve usr bin ls ls 48 vars 0 brk 0 0x27c1000 mmap NULL 4096 PROT READ PROT WRIT
  • 验证 BASH 脚本时出现问题 [已关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我在尝试验证 bash 脚本时出现代码 lint 错误 bin bash if eq 0 then printf No argum
  • 无法使用Linux服务启动Archiva 2.1.0

    我正在尝试在 Linux 上启动最近发布的 Apache Archiva v2 1 0 独立版 出于测试目的 该 zip 已解压缩在 opt archiva 2 0 文档说 http archiva apache org docs 2 1
  • 更改 Amazon RDS MYSQL Linux 服务器的 innodb_log_file_size 变量值

    我们正在使用 Amazon RDS linux 服务器作为 MYSQL 更改 my cnf 文件变量值的方法是什么 我正在尝试更改 innodb log file size 变量 您能告诉我哪一个是最好的改变方式吗 所以请帮我解决这个问题
  • Google PubSub 在阻止和等待消息时没有标准输出

    我正在使用这个问题底部的 Python 代码监听 Google PubSub 消息 它实际上是来自 Google 的异步拉取示例 我运行我的程序并输出到文件 python my script py tee log txt 如果我在接收消息时
  • 从 bash 脚本返回值

    我想创建一个返回值的 Bash 文件 意思是 在脚本 script a bash 中我有一定的计算 脚本 script b bash 会调用它 script a bash return 1 5 script b bash a value s
  • 每个进程是否都存在内核堆栈?

    每个用户空间进程是否都存在一个内核堆栈和一个用户空间堆栈 如果两个堆栈都存在 那么每个用户空间进程应该有 2 个堆栈指针 对吗 在 Linux 中 每个任务 用户空间或内核线程 都有一个 8kb 或 4kb 的内核堆栈 具体取决于内核配置
  • 什么是接口标识符

    我有一台笔记本电脑 使用一个或多个网络适配器连接到我组织的网络 我正在尝试编写一个工具来持续监控每个网络的连接状态和连接质量 然而 我的网络知识有限 术语让我感到困惑 特别是查找所有网络适配器 有人建议我使用命令ifconfig它给了我所谓
  • 远程 ssh 命令:第一个回显输出丢失

    我试图通过 ssh 1 liner 调用在远程机器上运行多个命令 方法是将它们指定为传递给 bash c 的分号分隔字符串 它适用于某些情况 但不适用于其他情况 看一下这个 Note the echo 1 output is lost ba
  • Linux 源代码中的哪个位置会识别特定的 USB 设备?

    我有一个特定的 USB 设备 我想检查其 Linux 驱动程序源代码 我的理解是 USB 驱动程序执行的第一步是注册自己能够处理具有特定供应商 ID 和产品 ID 的设备 就我而言 供应商 ID 是0BDA产品 ID 是8187 有了这些信
  • 每当调用 malloc/free 时输出到 stderr

    使用 Linux GCC C 每当调用 malloc free new delete 时 我想向 stderr 记录一些内容 我试图了解库的内存分配 因此我想在运行单元测试时生成此输出 我使用 valgrind 进行内存泄漏检测 但我找不到
  • bash 或 sh 中的“=”和“==”运算符有什么区别

    我意识到 和 运算符都可以在 if 语句中使用 例如 var some string if var some string then doing something fi if var some string then doing some
  • 无法在 R 中安装插入符号包(在我的 Linux 机器中)

    我在尝试在 R 中安装插入符号包时遇到以下错误 g error tmp Rtmp2Tos7n R INSTALL2e6e30153a74 nloptr nlopt 2 4 2 lib libnlopt cxx a No such file
  • 模拟用户输入以使用不同参数多次调用脚本

    我必须使用提供的脚本 该脚本在脚本运行时接受用户输入而不是参数 我无法解决这个问题 脚本的一个例子是 bin bash echo param one read one doSomething echo param two read two

随机推荐

  • python 编码 —— codecs 库

    1 对文件读写 import codecs fout codecs open test html w encoding UTF 8 fout write fout write fout close 很自然地可将其改造为 with 结构 wi
  • 淘宝TDDL数据库分库分表

    淘宝TDDL数据库分库分表 2014 06 04 23 18 3334人阅读 评论 0 收藏 举报 分类 数据库 1 分库分表 而且分库规则非常灵活 2 主键生成策略 目前TDDL提供的id生成主要还是依托数据库来进行的 oracle可以直
  • 八大排序算法-归并排序

    归并排序的定义 是将两个 或两个以上 有序表合并成一个新的有序表 即把待排序序列分为若干个子序列 每个子序列是有序的 然后再把有序子序列合并为整体有序序列 归并排序的基本思想 设r i n 由两个有序子表r i m 和r m 1 n 组成
  • ref绑定到不同元素获取到不同对象

    ref如果绑定在组件中 那么通过this ref refname获取到的是一个组建对象 ref如果绑定在普通的元素中 那么通过this ref refname获取到的是一个元素对象
  • 云呐

    科技大数据时代 企业的信息化规划刻不容缓 固定资产管理系统做为一款企业资产方案系统 可完成对企业资产的系统化管理 充分发挥资产更高的实用价值 固定资产管理系统可将企业內部全部资产融合在一起 根据对固定资产的增加 改动 退出 迁移 删除 使用
  • 2016年4月28日(6985小时时),第一次签合同,里程碑

    这周四 我觉得是个历史性的事件 是个里程碑 说明 锲而不舍 金石可镂 虽然不多 2万
  • win11/ win10 C盘扩容教程

    win11 win10 C 盘扩容教程 1 写在前面 10月5号微软官方正式发布了win11操作系统 作为一名科技星人 我也是第一时间升级体验了一番 如何升级win11我就不多说了 晚上一搜教程非常的多 这里推荐使用win11升级助手升级
  • 合宙ESP32系列

    目录 源文档见 ESP32系列编译文档 LuatOS 文档 本地编译详细步骤 准备环境 准备项目 获取源码 编译前的最后准备 编译 LuatOS SoC通用固件格式soc介绍 定制固件里的库 PS luat conf bsp h问题汇总 源
  • SGL STL源码剖析——迭代器

    SGL STL源码剖析 迭代器 迭代器 迭代器的型别 Traits的作用 迭代器相应的五种型别 type traits 迭代器 在我们使用STL容器的时候 迭代器是非常常见的 STL将容器和算法分开 彼此独立 然后通过迭代器相互关联 迭代器
  • U-Net: Convolutional Networks for Biomedical Image Seg-mentation

    Abstract 深度网络的成功训练需要数千个带注释的训练样本 这是一个很大的共识 在本文中 我们提出了一种网络和训练策略 它依赖于数据增强的强大使用 以更有效地使用可用的带注释的样本 该体系结构由捕获上下文的收缩路径和支持精确本地化的对称
  • 纯源码程序的执行

    QT Creator本身是个IDE安装的时候根据自己需要配置的又有对应的编译器 因此编写普通的程序也不再话下 选择Non Qt Project工程 并在右侧根据自己的需要选择C 应用还是C应用 新工程中工程管理文件和代码如下 执行结果如下
  • 表与表之间的关系

    一 表关系的概念 现实生活中 实体与实体之间肯定是有关系的 如 学生和老师 学生和课程 部门和员工 每个人和自己的身份证号码等 在设计表的时候 就应该体现出来表与表之间的这种关系 表与表之间的三种关系 一对多 最常用的关系 如部门和员工 多
  • 在ubuntu下如何搜索文件?

    1 whereis 文件名 特点 快速 但是是模糊查找 例如 找 whereis mysql 它会把mysql mysql ini mysql 所在的目录都找出来 我一般的查找都用这条命令 2 find name 文件名 特点 准确 但速度
  • 从端到端打通模型端侧部署流程(MNN)

    从端到端打通模型端侧部署流程 MNN MNN框架 MNN的官方介绍 MNN的架构 问题解决 MNN使用样例 MNN部署 一般流程 创建会话 运行会话 获取输出 流程汇总 总结 MNN框架 MNN的官方介绍 官方文档 有疑问一定要先查这里 M
  • 西门子 SCL 语言 模拟量转换小例程

    软硬件平台 软件是博图 TIA v15 硬件是西门子300系列 PLC 简介 使用scl语言编写一个FC子程序 对模拟量进行处理 对模拟数据进行转换 详细介绍 添加新块 添加一个FC块 语言选择scl 添加变量 输入型变量5个 一个运算后输
  • 信息学奥赛一本通 1177:奇数单增序列

    题目链接 http ybt ssoier cn 8088 problem show php pid 1177 include
  • 二进制思想及其应用

    两个经典面试题 二进制思想 1 你让工人为你工作7天 回报是一根金条 这个金条平分成相连的7段 每工作1天的回报就是1段 每天结束的时候 工人都有可能会向你要金条 如果只允许你两次把金条弄断 你如何给你的工人付费 2 有1000个苹果 将它
  • VTM配置并使用VTM对YUV视频帧进行编解码(基于windows系统)

    一 下载安装VTM H 266 VCC 参考软件VTM下载网址 https vcgit hhi fraunhofer de jvet VVCSoftware VTM 这里我选择的Tags是VTM 9 0 根据自己想用的VTM版本进行选择 然
  • 基于遗传算法的柔性生产调度研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 摘要 针对传统作业车间调度存在加工设备功能
  • Linux的时间函数

    2023年7月19日 周三下午 我今天基于GitHub搭建了自己的博客网站 欢迎大家来我的个人博客网站阅读我的博客 巨龙之路的GitHub个人博客 julongzhilu github io 目录 time 函数原型 使用方法 ctime