(C语言) time库-日期和时间工具

文章目录

  • ⏰介绍
  • ⏰常量
    • ⏱️`CLOCKS_PER_SEC`
  • ⏰类型
    • ⏱️`tm`
    • ⏱️`time_t`
    • ⏱️`clock_t`
    • ⏱️`timespec` (C11)
  • ⏰函数-时间操作
    • ⏲️`time`
    • 🏷️返回纪元开始经过的当前系统日历时间
    • ⏲️`clock`
    • 🏷️返回未加工的程序启动时开始经过的处理器时间
    • ⏲️`difftime`
    • 🏷️计算时间差
  • ⏰函数-格式转换-类型转换
    • ⏲️`gmtime`
    • 🏷️将从纪元开始的时间转换成以协调世界时(UTC)表示的日历时间
    • 🏷️time_t -> tm
    • ⏲️`localtime`
    • 🏷️将从纪元开始的时间转换成以本地时间表示的日历时间
    • 🏷️time_t -> tm
    • ⏲️`mktime`
    • 🏷️将日历时间转换成纪元开始经过的时间
    • 🏷️tm -> time_t
  • ⏰函数-格式转换-文本表示
    • ⏲️`asctime`
    • 🏷️将 `struct tm` 对象转换成文本表示
    • 🏷️tm -> str
    • ⏲️`ctime`
    • 🏷️将 `struct time_t` 对象转换成文本表示
    • 🏷️time_t -> str
    • ⏲️`strftime`
    • 🏷️将 `struct tm` 对象转换成自定义文本表示
    • 🏷️time_t -> copyToStr
  • ⏰格式
    • 🧮`Www Mmm dd hh:mm:ss yyyy\n`
  • ⏰应用
    • ✍️力扣[1185. 一周中的第几天](https://leetcode.cn/problems/day-of-the-week/)
    • ✍️力扣[1154. 一年中的第几天](https://leetcode.cn/problems/day-of-the-year/)
  • END

⏰介绍

日期和时间工具 - cppreference.com

<time.h> 是在C语言中的日期与时间工具。其中主要有三大模块,常量,类型和函数。

在C++中推荐写成<ctime>,基本都是继承.h中的东西。

函数主要分为两类,时间操作函数和格式转换函数。

本文主要为C语言中的标准操作,其中在C11和C23又添加和废弃了许多内容,但这块不会本文着重讲解。

UTC 协调世界时

纪元(地球纪元)

夏令时

⏰常量

⏱️CLOCKS_PER_SEC

  • CLOCKS_PER_SEC - cppreference.com
  • (宏常量)
  • 处理器每秒的时间计数
  • 一般来说都是数值1000
#include <stdio.h>
#include <time.h>int main(void) {clock_t beg = clock();clock_t end = clock();printf("Use time:%lf\n", 1.0 * (end - beg) / CLOCKS_PER_SEC);
}

⏰类型

⏱️tm

  • tm - cppreference.com

  • (结构体)

  • 日历时间类型

struct tm {int tm_sec;    // [秒 [0, 61] (C89) [0, 60] (C99)] seconds after the minuteint tm_min;    // [分 [0, 59]] minutes after the hourint tm_hour;   // [时 [0, 23]] hours since midnightint tm_mday;   // [日 [1, 31]] day of the monthint tm_mon;    // [月 [0, 11]] months since Januaryint tm_year;   // [年 [1900:0]] years since 1900int tm_wday;   // [周 [0, 6]] days since Sundayint tm_yday;   // [第几天 [0, 365]] days since January 1int tm_isdst;  // [夏时令标签] daylight savings time flag
};
#include <stdio.h>
#include <time.h>int main(void) {struct tm start = {.tm_mday = 1};mktime(&start);// Sun Jan 01 00:00:00 1900printf("%s\n", asctime(&start));
}

⏱️time_t

  • time_t - cppreference.com
  • (typedef)
  • 从纪元开始的日历时间类型

⏱️clock_t

  • clock_t - cppreference.com
  • (typedef)
  • 从时点开始的处理器时间类型

⏱️timespec (C11)

  • timespec - cppreference.com
  • (结构体)
  • 单位为秒和纳秒的时间
// 保有时间间隔的结构体,将其拆分成秒数和纳秒数。
struct timespec {time_t tv_sec;   // [秒 >= 0] Seconds long   tv_nsec;  // [纳秒 [0, 999999999]] Nanoseconds
};

timespec_get()

C11 返回基于给定时间基底的日历时间

#include <stdint.h>
#include <stdio.h>
#include <time.h>int main(void) {struct timespec ts;// C11 函数// 修改 ts 所指向的 struct timespec 对象// 以保有以时间基底 base 表示的当前日历时间。
#ifdef TIME_UTCtimespec_get(&ts, TIME_UTC);
#endifchar buff[100];strftime(buff, sizeof buff, "%D %T", gmtime(&ts.tv_sec));printf("Current time: %s.%09ld UTC\n", buff, ts.tv_nsec);printf("Raw timespec.time_t: %jd\n", (intmax_t)ts.tv_sec);printf("Raw timespec.tv_nsec: %09ld\n", ts.tv_nsec);
}

⏰函数-时间操作

⏲️time

time - cppreference.com

🏷️返回纪元开始经过的当前系统日历时间

time_t time( time_t *arg );
  • 运行失败
    • return -1
  • 运行成功
    • 入参,返回值数值一致
#include <stdio.h>
#include <time.h>int main(void) {time_t in;time_t out = time(&in);// >success:    out == in// >error:      -1// 1709276388 = time(1709276388)printf("%ld = time(%ld)\n", out, in);return 0;
}

⏲️clock

clock - cppreference.com

🏷️返回未加工的程序启动时开始经过的处理器时间

clock_t clock(void);

最经典的应用就是计时器了。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define ARR_LEN (100000)// return (arg1 > arg2) - (arg1 < arg2); // 可行的简写
// return arg1 - arg2; // 错误的简写(若给出 INT_MIN 则会失败)
int cmp(const void* a, const void* b) {int arg1 = *(const int*)a;int arg2 = *(const int*)b;if (arg1 < arg2) {return -1;}if (arg1 > arg2) {return 1;}return 0;
}int main(void) {int arr[ARR_LEN];clock_t beg = clock();qsort(arr, sizeof(arr) / sizeof(*arr), sizeof(int), cmp);clock_t end = clock();printf("Use time:%lf\n", 1.0 * (end - beg) / CLOCKS_PER_SEC);
}

⏲️difftime

difftime - cppreference.com

🏷️计算时间差

double difftime( time_t time_end, time_t time_beg );

简单测了下和直接相减效果一样。可能是为了统一接口和适配器模式。

#include <stdio.h>
#include <time.h>int main(void) {time_t now = time(NULL);time_t beg = {0};// 计算时间差double during = difftime(now, beg);printf("Now:\t %lf\n", 1.0 * now);printf("During:\t %lf\n", during);
}

⏰函数-格式转换-类型转换

⏲️gmtime

gmtime, gmtime_r, gmtime_s - cppreference.com

🏷️将从纪元开始的时间转换成以协调世界时(UTC)表示的日历时间

🏷️time_t -> tm

注意,这里存储的是一个全局的静态对象。

函数 gmtime 可能不是线程安全的。

struct tm *gmtime  ( const time_t *timer );
#include <stdio.h>
#include <time.h>int main(void) {time_t t = time(NULL);struct tm *tm_p1 = gmtime(&t);struct tm *tm_p2 = gmtime(&t);// 指向同一个静态对象printf("First  struct tm* = %p\n", tm_p1);printf("Second struct tm* = %p\n", tm_p2);printf("UTC:   %s", asctime(gmtime(&t)));printf("local: %s", asctime(localtime(&t)));
}

⏲️localtime

localtime, localtime_r, localtime_s - cppreference.com

🏷️将从纪元开始的时间转换成以本地时间表示的日历时间

🏷️time_t -> tm

注意,这里存储的是一个全局的静态对象。

函数 localtime 可以不是线程安全的。

struct tm *localtime  ( const time_t *timer );
#include <stdio.h>
#include <time.h>int main(void) {time_t t = time(NULL);struct tm *tm_p1 = localtime(&t);struct tm *tm_p2 = localtime(&t);// 指向同一个静态对象printf("First  struct tm* = %p\n", tm_p1);printf("Second struct tm* = %p\n", tm_p2);printf("UTC:   %s", asctime(gmtime(&t)));printf("local: %s", asctime(localtime(&t)));
}

⏲️mktime

mktime - cppreference.com

🏷️将日历时间转换成纪元开始经过的时间

🏷️tm -> time_t

time_t mktime( struct tm *time );
#include <stdio.h>
#include <stdlib.h>
#include <time.h>int main(void) {time_t now = time(NULL);// 获取当前时间,并加一天struct tm tmm = *localtime(&now);tmm.tm_mday += 1;time_t nexDay = mktime(&tmm);printf("Now:\t%ld\n", now);printf("NexDay:\t%ld\n", nexDay);printf("OneDayTime:\t%lf\n", difftime(nexDay, now));printf("24*60*60=\t%d\n", 24 * 60 * 60);
}

⏰函数-格式转换-文本表示

⏲️asctime

asctime, asctime_s - cppreference.com

🏷️将 struct tm 对象转换成文本表示

🏷️tm -> str

asctime 返回指向静态数据的指针从而不是线程安全的。

char* asctime( const struct tm* time_ptr );
#include <stdio.h>
#include <time.h>int main(void) {struct tm tm = *localtime(&(time_t){time(NULL)});printf("%s\n", asctime(&tm));printf("%p\n", asctime(&tm));printf("%p\n", asctime(&tm));
}

⏲️ctime

ctime, ctime_s - cppreference.com

🏷️将 struct time_t 对象转换成文本表示

🏷️time_t -> str

char* ctime( const time_t* timer );
#include <stdio.h>
#include <time.h>int main(void) {time_t result = time(NULL);printf("%s\n", ctime(&result));printf("%p\n", ctime(&result));printf("%p\n", ctime(&result));
}

⏲️strftime

strftime - cppreference.com

🏷️将 struct tm 对象转换成自定义文本表示

🏷️time_t -> copyToStr

size_t strftime(char* str, size_t count, const char* format,const struct tm* time);
#include <stdio.h>
#include <time.h>int main(void) {struct tm now_tm = *localtime(&(time_t){time(NULL)});char buff[1024];// >strftime():Friday 03/01/24 19:41:24if (strftime(buff, sizeof buff, ">strftime():%A %c", &now_tm)) {puts(buff);} else {puts("strftime failed");}
}

⏰格式

🧮Www Mmm dd hh:mm:ss yyyy\n

// `asctime() & ctime()`以下固定的 25 字符表示形式: `Www Mmm dd hh:mm:ss yyyy\n`
errno_t asctime_s( char* buf, rsize_t bufsz, const struct tm* time_ptr );
errno_t ctime_s( char *buf, rsize_t bufsz, const time_t* timer );
  • Www ——来自 time_ptr->tm_wday星期之日的三字母英文缩写, MonTueWedThuFriSatSun 之一。
  • Mmm ——来自 time_ptr->tm_mon名的三字母英文缩写, JanFebMarAprMayJunJulAugSepOctNovDec 之一。
  • dd ——来自 timeptr->tm_mday 的 2 位月之日,如同由 sprintf 以 %2d 打印
  • hh ——来自 timeptr->tm_hour 的 2 位,如同由 sprintf 以 %.2d 打印
  • mm ——来自 timeptr->tm_min 的 2 位,如同由 sprintf 以 %.2d 打印
  • ss ——来自 timeptr->tm_sec 的 2 位,如同由 sprintf 以 %.2d 打印
  • yyyy ——来自 timeptr->tm_year + 1900 的 4 位,如同由 sprintf 以 %4d 打印

若是非法入参则行为未定义,如:

  • *time_ptr 的任何成员在其正常范围外则行为未定义

  • time_ptr->tm_year 所指示的历年拥有多于 4 位数或小于 1000 年则行为未定义。


自定义格式函数:

strftime()的格式:strftime - cppreference.com

⏰应用

下面两份是使用C++代码表示。

其中主要用到的是<ctime>的类型,还有一些别的库中对时间操作的函数。

✍️力扣1185. 一周中的第几天

给你一个日期,请你设计一个算法来判断它是对应一周中的哪一天。

输入为三个整数:daymonthyear,分别表示日、月、年。

您返回的结果必须是这几个值中的一个 {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}

static const std::string weekDays[] = { "Sunday",   "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" 
};class Solution {
public:std::string dayOfTheWeek(int day, int month, int year) {std::tm ctm{};ctm.tm_year = year - 1900;ctm.tm_mon = month - 1;ctm.tm_mday = day;// a timestampstd::time_t ctime_t = std::mktime(&ctm);// return a static retctm = *std::localtime(&ctime_t);return weekDays[ctm.tm_wday];}
};

✍️力扣1154. 一年中的第几天

给你一个字符串 date ,按 YYYY-MM-DD 格式表示一个 现行公元纪年法 日期。返回该日期是当年的第几天。

class Solution {
public:int dayOfYear(string date) {std::tm dt;std::istringstream(date) >> std::get_time(&dt, "%Y-%m-%d");return dt.tm_yday + 1;}
};



END

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

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

相关文章

学习JAVA的第十四天(基础)

目录 Collection集合 迭代器遍历 增强for遍历 Lambda表达式遍历 List集合 遍历 数据结构 栈 队列 数组 链表 前言&#xff1a; 学习JAVA的第十三天 Collection集合 Collection的遍历方式&#xff1a; 迭代器&#xff08;不依赖索引&#xff09;遍…

Java线程池及Thread相关问题

Java线程池及Thread相关问题 一、Java线程池有哪些核心参数&#xff0c;分别有什么的作用&#xff1f;二、线程池有哪些拒绝策略&#xff1f;三、线程池的执行流程?四、线程池核心线程数怎么设置呢&#xff1f;方式一方式二基本原则 五、ThreadLocal底层是怎么实现的&#xff…

SoraAI优先体验资格注册教程

SoraA1视频工具优先体验资格申请 申请网址&#xff1a;https://openai.com/form/red-teaming-network 申请步骤&#xff1a; 填写基础信息 请使用英文根据内容填写以下内容&#xff0c;名、姓、电子邮件、居住国家、组织隶属关系(如果有)、教育水平 、学位&#xff08;哪个领…

利用Python副业赚钱,看完这篇你就懂了!

Python都可以做哪些副业&#xff1f; 1、兼职处理数据Excel整理数据功能虽然很强大&#xff0c;但在Python面前&#xff0c;曾经统治职场的它也的败下阵来。因为Python在搜集数据整理分析数据的过程中更加便捷&#xff0c;通过几行代码还可以实现自动化操作。 如果你学会Pyth…

指针运算笔试题解析

题目1&#xff1a; int main() { int a[5] { 1, 2, 3, 4, 5 }; int* ptr (int*)(&a 1); printf("%d %d", *(a 1), *(ptr - 1)); return 0; } ptr中存放了整个数组的地址&#xff0c;ptr是int*类型&#xff0c;&a1跳到5的地址后又被强制类…

EasyX的学习2

消息处理——漂亮的按钮(鼠标) 用到的函数 1.消息结构体变量类型&#xff1a;使用ExMessage ExMessage msg{ 0 }; 定义一个变量名为msg的ExMessage结构体变量并初始化为0 2.获取消息函数&#xff1a;peekmessage函数 //获取消息 peekmessage(&msg, EX_MOUSE); 两个参…

【打工日常】使用docker部署在线Photopea用于linux下替代ps

一、Photopea介绍 linux没有ps适配&#xff0c;对于有时候工作来说确实不方便&#xff0c;我找了很久&#xff0c;才找到了一款功能可以跟ps接近的在线软件&#xff0c;使用docker部署就可以了。它是ps的最佳替代品之一&#xff0c;其界面几乎与ps相同&#xff0c;只不过它是在…

MySQL基础-----SQL语句之DCL数据控制语句

目录 前言 一、管理用户 1.查询用户 2.创建用户 3.修改用户密码 4.删除用户 案例 二、权限控制 1.查询权限 2.授予权限 3.撤销权限 案例 前言 本期我们学习SQL语句的最后一部分内容&#xff0c;也就是数据控制语句DCL。DCL英文全称是Data Control Language(数据控制语…

鱼哥赠书活动第12期:《基于React低代码平台开发》

鱼哥赠书活动第12期&#xff1a;《基于React低代码平台开发》 一、React与低代码平台的结合优势二、基于React的低代码平台开发挑战三、基于React的低代码平台开发实践四、未来展望内容简介&#xff1a;作者简介如何阅读&#xff1a;适合阅读人群&#xff1a;赠书抽奖规则:往期…

DMA 链表模式(LLI)深度解析

在进行一次 DMA 读或者写的时候&#xff0c;可以配置多个链表&#xff0c;从而当一个链表的数据传输完成时&#xff0c;会跳到下一个链表的起始地址&#xff0c;并继续传输数据&#xff0c;直到链表的下一个地址为 0。如果 DMA 使能了完成中断&#xff0c;则当 DMA 发送或者接收…

15 实战:Kaggle房价预测 + 课程竞赛:加州2020年房价预测【李沐动手学深度学习课程笔记】

15 实战&#xff1a;Kaggle房价预测 课程竞赛&#xff1a;加州2020年房价预测【李沐动手学深度学习课程笔记】https://zhuanlan.zhihu.com/p/685343754 写在前面&#xff1a;这里格式很乱&#xff0c;代码直接去知乎copy 1 实战Kaggle比赛&#xff1a;预测房价 1.1 实现几个函…

【源码】imx6ull实现触摸屏单点实验-移植tslib和qt

一、本实验实验的器材&#xff1a; 1.正点原子imx6ull的阿尔法开发板v2.2 2.屏幕ALIENTEK 4.3 RGBLCD 二、实验已经移植好的文件&#xff1a; 仓库代码&#xff1a;https://gitee.com/wangyoujie11/atkboard_-linux_-driver.git 1.文件说明 arm-qt.tar.bz2&#xff1a;移植好的…

基于SSM的农业信息管理系统的设计与实现(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的农业信息管理系统的设计与实现&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;…

Mint_21.3 drawing-area和goocanvas的FB笔记(四)

Cairo图形输出 cairo的surface可以是pixbuf, 可以是screen, 可以是png图&#xff0c;也可以是pdf文件 、svg文件、ps文件&#xff0c;定义了surface就可以用cairo_create(surface)产生cairo context, 操作cairo context就可以方便地在surface上画图&#xff0c;如果surface是p…

Linux基本命令

一、基本命令 修改mysql端口号 vim /etc/my.cnf云服务器ssh端口修改 vim /etc/ssh/sshd_config1.1 关机和重启 关机 shutdown -h now 立刻关机 shutdown -h 5 5分钟后关机 poweroff 立刻关机重启 shutdown -r now 立刻重启 shutdown -r 5 5分钟后重启 reboot 立刻重启1.2…

使用mysqld --install命令时出现MSVCR120.dll文件丢失错误

Visual C 2013 and Visual C Redistributable Package https://support.microsoft.com/en-us/help/3179560/update-for-visual-c-2013-and-visual-c-redistributable-package 进去之后先找到自己的版本&#xff0c;x64还是x86&#xff0c;下载 vcredit &#xff0c;进行安装即…

小程序固定头部:CSS实现

效果图 代码逻辑&#xff1a;设置头部的高度&#xff0c;浮动固定后&#xff0c;再加个这个高度的大小的外边距 .weui-navigation-bar {position: fixed;top: 0px;left: 0px;right: 0px;height:90px; } .weui-navigation-bar_bottom{height:90px; }

高转化利器】Xinstall实现H5唤醒App,打开指定页面,轻松满足营销需求!

在移动互联网时代&#xff0c;App的拉新促活对于企业的发展至关重要。为了提升用户体验和转化率&#xff0c;Xinstall推出了一项强大的功能——H5唤醒App。通过这一功能&#xff0c;用户可以直接从Web页面拉起App&#xff0c;并在拉起过程中通过传参打开指定页面&#xff0c;满…

【Vue3】Hooks:一种全新的组件逻辑组织方式

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

MATLAB环境下基于离散小波变换的体外血管图像处理

下面简要介绍小波变换的部分应用。 信号去噪。小波去噪是根据有效信号和噪声信号在小波变换后表现出的不同特性实现的&#xff0c;一般可用于去除语音、图像、视频等中的噪声信号。小波去噪方法根据对小波系数的非线性处理方式分为三类&#xff0c;分别是小波变换模极大值去噪…