(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.pswp.cn/news/713582.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713582.shtml
英文地址,請注明出處:http://en.pswp.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;但也可能成為制造虛假…