当前位置: 首页 > ops >正文

时间获取函数

获取utc标准时间

c语言提供了主要两个函数time以及localtime来处理时间,。以及提供了time_t以及struct tm结构体来获取时间的具体信息。

time_t now; // 声明一个time_t类型的变量now,time_t类型变量(本质是整数,存储秒数)

time(&now); // 调用time()函数, 将当前时间戳(秒数)写入now变量

struct tm *t = localtime( &now ); //上面经过time函数后,now里填充的是从1970年到当前时间的秒数,经过localtime函数格式化,转换为年月日...的本地时间(以struct tm结构体的形式表示),返回指向该结构体的指针,用t接收。接下来就可以打印这个结构体。得到格式化的本地时间了。

  1. time_t now;:声明一个time_t类型的变量nowtime_t是 C 标准库中定义的用于表示时间的类型,通常是整数类型,用于存储从 Unix 纪元(1970 年 1 月 1 日 00:00:00 UTC )开始到当前的秒数。

  2. time(&now);:调用time函数获取当前时间。time函数的参数是一个指向time_t类型的指针,这里将now的地址&now传入,函数会把获取到的当前时间(从 Unix 纪元开始的秒数 )存储到now变量中。该函数若成功执行,会返回相同的时间值(即存储到now中的值 ),若失败则返回 - 1 。

  3. struct tm *t = localtime( &now );:调用localtime函数,将now变量存储的时间值(从 Unix 纪元开始的秒数,属于 UTC 时间 )转换为本地时间。localtime函数的参数是指向time_t类型的指针,这里传入&now 。函数会将转换后的本地时间以struct tm结构体形式表示,并返回指向该结构体的指针,这里用指针变量t接收。struct tm结构体包含年、月、日、时、分、秒等时间信息成员 。

  4. time()获取原始时间戳(秒数)。

  5. localtime()将秒数转换为本地时间的年、月、日等字段。

  6. 通过struct tm访问这些字段或进一步格式化为字符串。

time()函数

  • 头文件#include <time.h>

  • 语法time_t time(time_t *t)

  • 参数:

    • t 是指向time_t类型的指针,用于存储函数获取的当前时间值(从 Unix 纪元 1970 年 1 月 1 日 00:00:00 UTC 起经过的秒数)。如果传递NULL,函数会返回当前时间值,但不存储它 。

  • 返回值:

    • 成功时,返回当前时间值(从 Unix 纪元起的秒数),类型为time_t

    • 失败时,返回 - 1 。

localtime()函数

  • 头文件#include <time.h>

  • 语法struct tm *localtime(const time_t *timer)

  • 参数:

    • timer是指向time_t类型的指针,通常传入time()函数获取的时间值(从 Unix 纪元起的秒数) 。

  • 返回值:

    • 成功时,返回一个指向struct tm结构体的指针,该结构体包含了转换后的本地时间信息,如年、月、日、时、分、秒等 。struct tm结构体在<time.h>中定义

time_t now;

time(&now);

struct tm *t = localtime( &now );

例子代码:

#include <time.h> 
int main(){ 
time_t t; time(&t); struct tm *now = localtime(&t); printf("年份:%d,月份:%d 天数:%d %d:%d:%d 星期%d\n",now->tm_year+1900,now->tm_mon+1,now->tm_mday,now->tm_hour,now->tm_min,now->tm_sec,now->tm_wday);return 0;}

时间运算可以用这个,但是我们现在是要更灵活的格式化时间

时间格式化函数

(1)strftime

  • 概念

    是一个更灵活的时间格式化函数,它允许用户定义时间的输出格式。使用 strftime 可以定制输出的日期和时间格式。

  • 语法

size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr);
  • 参数

    • str 是一个字符数组,用于存储格式化后的字符串。

    • maxsizestr 数组的最大长度。

    • format 是一个格式字符串,它指定了输出格式。

    • timeptr 是指向 struct tm 结构体的指针。strftime() 函数的返回值是一个 size_t 类型的整数,表示实际写入到目标缓冲区的字符数不包含字符串终止符 \0)。

  • 返回值

    • strftime() 函数的返回值是一个 size_t 类型的整数,表示实际写入到目标缓冲区的字符数不包含字符串终止符 \0)。

#include <time.h>
​
time_t now;    // 定义time_t类型变量,用于存储时间戳(秒数)
​
time(&now);     //调用time()函数获取当前时间戳(从1970年1月1日起的秒数),并存储到now中
​
struct tm *t = localtime( &now );// 将时间戳转换为本地时间(考虑时区),返回struct tm结构体指针
​
char time[64];//   定义字符数组,用于存储格式化后的时间字符串
​
int len = sizeof(time) / sizeof(time[0]); 计算数组长度(即64)
​
strftime(time, len ,"%Y年%m月%d日 %H:%M:%S ",t);//格式化时间
​
printf("当前的时间是:%s \n", time);

封装成函数:

// 版本1:使用静态缓冲区(无需手动释放,但非线程安全)
const char* getTime()
{static char time[64];  // 静态缓冲区,函数返回后仍有效time_t now;   // 定义time_t类型变量,用于存储时间戳(秒数)`time(&now);   //调用time()函数获取当前时间戳(从1970年1月1日起的秒数),并存储到now中struct tm* t = localtime(&now);// 将时间戳转换为本地时间(考虑时区),返回struct tm结构体指针strftime(time, sizeof(time), "%Y年%m月%d日 %H:%M:%S", t);//格式化时间return time;
}
// 版本2:动态分配内存(需手动free,但线程安全)
char* getTime_dong() 
{time_t now;   // 定义time_t类型变量,用于存储时间戳(秒数)`time(&now);   //调用time()函数获取当前时间戳(从1970年1月1日起的秒数),并存储到now中struct tm* t = localtime(&now);// 计算所需缓冲区大小size_t len = strftime(NULL, 0, "%Y年%m月%d日 %H:%M:%S", t) + 1;//strftime() 函数的返回值是一个size_t类型的整数,表示实际写入到目标缓冲区的字符数(不包含字符串终止符 `\0`,所以加一)。//传入 NULL 和 0 是 strftime() 函数的一种特殊用法,用于在不实际写入字符串的情况下计算所需的缓冲区大小。//也可以直接定义len = 64,直接给一个较大的值char* time = (char*)malloc(len);if (time == NULL) {perror("malloc,failed");exit(EXIT_FAILURE);}// 内存分配失败strftime(time, len, "%Y年%m月%d日 %H:%M:%S", t);return time;
}
// 示例调用
int main()
{// 使用静态缓冲区版本const char* time1 = getTime();printf("静态版本: %s\n", time1);
​// 使用动态分配版本char* time2 = getTime_dong();if (time2){printf("动态版本: %s\n", time2);free(time2);  // 必须释放内存!}
​//直接使用int times[64] = { 0 };time_t t;time(&t);struct tm* now = localtime(&t);strftime(times, sizeof(times), "%Y年%m月%d日,%H:%M:%S",now);printf("%s", times);
​return 0;
}

http://www.xdnf.cn/news/12105.html

相关文章:

  • 制作官网水平导航栏
  • 开源供应链攻击持续发酵,多个软件包仓库惊现恶意组件
  • 捍卫低空安全!-中科固源发现无人机MavLink协议远程内存泄漏漏洞
  • 设计模式(代理设计模式)
  • 墨者学院-密码学实训隐写术第二题
  • 【C++快读快写】
  • nt!CcMapData函数分析之Loop to touch each page触发nt!MmAccessFault函数----NTFS源代码分析之四
  • 中国西部逐日1 km全天候地表温度数据集(TRIMS LST-TP;2000-2024)
  • npm run dev 报错:Error: error:0308010C:digital envelope routines::unsupported
  • UDP:简洁高效的报文结构解析与关键注意事项
  • std::conditional_t一个用法
  • [10-2]MPU6050简介 江协科技学习笔记(22个知识点)
  • MVCC机制:Undo Log版本链与ReadView机制
  • Python Excel 文件处理:openpyxl 与 pandas 库完全指南
  • 使用高斯朴素贝叶斯算法对鸢尾花数据集进行分类
  • 数据库优化实战分享:高频场景下的性能调优技巧与案例解析
  • 结构体指针与非指针 问题及解决
  • To be or Not to be, That‘s a Token——论文阅读笔记——Beyond the 80/20 Rule和R2R
  • centos升级内核
  • LuaJIT2.1 和 Lua5.4.8 性能对比
  • C++网络通信:TCP数据包的发送与接收编程
  • PyCharm中运行.py脚本程序
  • Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
  • 基于BI PaaS架构的衡石HENGSHI SENSE平台技术解析:重塑企业级数据分析基座
  • 猎板厚铜PCB工艺能力如何?
  • Web 架构相关文章目录(持续更新中)
  • Jenkins | Linux环境部署Jenkins与部署java项目
  • select、poll、epoll 与 Reactor 模式
  • 70年使用权的IntelliJ IDEA Ultimate安装教程
  • 代码中文抽取工具并替换工具(以ts为例)