(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.mzph.cn/news/713582.shtml

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

相关文章

(delphi11最新学习资料) Object Pascal 学习笔记---第6章第3节(字符串连接)

6.3.3 字符串连接 ​ 我已经提到过&#xff0c;与其他语言不同&#xff0c;Object Pascal 完全支持直接字符串连接&#xff0c;这实际上是一个相当快的操作。在本章中&#xff0c;我将向您展示一些字符串连接代码和一些速度测试。稍后&#xff0c;在第 18 章中&#xff0c;我将…

第十五天-爬虫项目实战

目录 1.介绍 2.代码 1.main.py 2.PageSider.py 3.DetailSpider.py 4.DataParse.py 5.Constant.py 6.HanderRequest.py 1.介绍 1. 使用多线程爬取网站 2.爬取数据后保存至excel 3.爬取网站(仅做测试)网创类项目爬取&#xff1a;https://www.maomp.com/ 4..实现效果 …

python66-Python的循环之常用工具函数

使用zip()函数可以把两个列表“压缩”成一个zip对象(可迭代对象),这样就可以使用一个循环并行遍历两个列表。为了测试 zip()函数的功能,我们可以先在交互式解释器中“试验”一下该函数的功能。 # !/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2024/01# @Author : …

元数据优化:提升您的网站在搜索引擎中的表现

前言 在之前的文章中&#xff0c;我们探讨了如何通过超链接来提高用户在网站的使用体验。本篇将聚焦于元数据的优化&#xff0c;揭示它如何成为提升网站曝光率和点击率的秘密武器。 一、介绍 元数据&#xff0c;或称之为数据的数据&#xff0c;在网页开发中占据着不可忽视的角…

IPD MM流程之业务策略工具:安索夫矩阵

IPD市场管理流程&#xff0c;华为内部称为“MM流程”&#xff08;Market Management&#xff0c;MM&#xff09;。华为市场管理是通过对市场和细分市场的分析&#xff0c;制定细分市场的策略&#xff0c;形成商业计划&#xff0c;把商业计划落实在日常工作当中。MM流程其中一个…

git根据文件改动将文件自动添加到缓冲区

你需要修改以下脚本中的 use_cca: false 部分 #!/bin/bash# 获取所有已修改但未暂存的文件 files$(git diff --name-only)for file in $files; do# 检查文件中是否存在"use_cca: false"if grep -q "use_cca: false" "$file"; thenecho "Ad…

3.1线程作业

1.要求定义一个全局变量char buf"1234567"&#xff0c;创建两个线程&#xff0c;不考虑退出条件。 a.A线程循环打印buf字符串&#xff0c; b.B线程循环倒置buf字符串&#xff0c;即buf中本来存储1234567&#xff0c;倒置后buf中存储7654321.B线程中不打印!! c.倒置…

qt5-入门-使用拖动方式创建Dialog

参考&#xff1a; C GUI Programming with Qt 4, Second Edition 本地环境&#xff1a; win10专业版&#xff0c;64位&#xff0c;Qt5.12 目录 实现效果基本流程逐步实操1&#xff09;创建和初始化子部件2&#xff09;把子部件放进布局中3&#xff09;设置tab顺序4&#xff09…

jstat命令查看jvm的GC信息

文章目录 前言jstat命令查看jvm的GC信息1. 概述2. 应用堆内存水位阀值大小怎么确定3. 使用 jps 命令查看 Java 进程的进程号&#xff08;PID&#xff09;![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/5097401443314e9d808a83b694dbc6e5.png)4. jstat用法5. 类加载…

UE4 Niagara 关卡3.1官方案例解析二

自己尝试做做&#xff0c;打乱顺序 1、新建空的niagara system&#xff0c;添加空的发射器。更换渲染器为网格体渲染器并添加网格体。 2、发射器更新里面添加Spawn Rate&#xff0c;发射个粒子看看 效果图&#xff1a; 3、采样静态网格体&#xff0c;网格体粒子出生于静态网格…

【排序算法】基数排序

一&#xff1a;基本概念 1.1 基数排序(桶排序)介绍 基数排序&#xff08;radix sort&#xff09;属于“分配式排序”&#xff08;distribution sort&#xff09;&#xff0c;又称“桶子法”&#xff08;bucket sort&#xff09;或bin sort&#xff0c;顾名思义&#xff0c;它是…

【图说】电脑发展史

免责声明:文中有一些图片来源自网络,如有版权请通知我删除,谢谢! “结绳记事”是计算的开端 如果说“结绳记事”仅是计数,那么“算筹”就是真正的计算工具 算盘也是我们老祖宗的杰出发明,最擅长“加减乘除”,包括但不限于乘方、开方、对数等。还能进行开发智力的“珠心算…

鼠标失灵怎么办?电脑出现鼠标失灵的详细处理方法介绍

无论是笔记本电脑还是台式机电脑&#xff0c;鼠标是必不可少的外设之一&#xff0c;而我们在使用电脑的过程中&#xff0c;经常回遇到鼠标突然失灵了&#xff0c;不听使唤&#xff0c;控制不了&#xff0c;接下小编来与大家一起分享&#xff0c;遇到这种情况我们该怎么办 有时…

C语言学习笔记(二)

C语言学习 学习笔记(一) 学习笔记(二&#xff09; 文章目录 C语言学习一、C语言中的数据类型进制二进制八进制十六进制进制转换表 单位换算寻址 数据类型基本类型整数类型整数的有符号和无符号实数类型字符型 构造类型指针类型空类型总结 常量直接常量符号常量转义符 符号常量…

Python并发编程:多线程-GIL全局解释器锁

一 引子 在Cpython解释器中&#xff0c;同一个进程下开启的多线程&#xff0c;同一时刻只能有一个线程执行&#xff0c;无法利用多核优势首先&#xff1a;需要明确的一点是GIL并不是Python的特性&#xff0c;它是在实现Python解析器(CPython)时所引入的一个概念。就好比c是一套…

协议(网络协议)

HTTP/HTTPS 协议 HTTP 实际上是个缩写&#xff0c;英文全称是&#xff1a;Hyper Text Transfer Protocol &#xff08;超文本传输协议&#xff09;。 最常用的网页&#xff08;也叫web页&#xff09;就是一种超文本的具体表现形式。HTTPS &#xff08;全称&#xff1a;Hyper …

美团-放水果

题目&#xff1a; 放水果 把M个相同的水果放在N个同样的盘子里&#xff0c;允许有的盘子空着不放&#xff0c;问不同的放法数K是多少&#xff1f;请注意&#xff0c;5&#xff0c;1&#xff0c;1和1&#xff0c;5&#xff0c;1 是同一种放法。输入描述 第一行是测试数据的数目…

【Spring】19 @Autowired注解使用详解

文章目录 构造函数注入Setter方法注入字段注入数组和集合注入特殊情况处理特殊接口类型的注入异常处理结语 Spring 框架的 Autowired 注解是实现依赖注入的一种强大而灵活的方式。在本文中&#xff0c;我们将介绍 Autowired 注解的多种用法&#xff0c;包括构造函数、setter方法…

ICASSP2024 | ICMC-ASR 车载多通道语音识别挑战赛总结

为促进驾驶场景中语音处理和识别研究&#xff0c;在ISCSLP 2022上成功举办智能驾驶座舱语音识别挑战 (ICSRC)的基础上&#xff0c;西工大音频语音与语言处理研究组 (ASLPNPU)联合理想汽车、希尔贝壳、WeNet社区、字节、微软、天津大学、南洋理工大学以及中国信息通信研究院等多…

EMO在哪体验?阿里对口型视频生成工具EMO下载地址?阿里巴巴新模型EMO的技术原理

这几天&#xff0c;阿里的对口型视频生成工具EMO火了。根据官方宣传&#xff0c;EMO只需要上传一张图片和一段音频就可以一键生成对口型视频&#xff0c;而且视频中的嘴型还可以与声音匹配。这项技术支持多语言、对话、唱歌以及快速语速的适配&#xff0c;但也可能成为制造虚假…