網站首頁 編程語言 正文
C/C++ 中時間的概念
Unix 時間戳(Unix timestamp),或稱 Unix 時間(Unix time)、POSIX 時間(POSIX time),是一種時間表示方式,定義為從格林威治時間1970年01月01日00時00分00秒起至現在的總秒數。time_t 就是用來存儲該數的一個類型,它是 unsigned long 類型。使用64位二進制數字表示時間的系統,最多可以使用到格林威治時間292,277,026,596年12月04日15時30分08秒。如果想要更精確一點,可以用結構 struct timeval,它可以精確到微秒:
struct timeval
{
long tv_sec; // 秒
long tv_usec; // 微秒
};
而直接存儲年月日時分秒等的是一個結構體:
struct tm
{
int tm_sec; // 秒,正常范圍0-59, 允許至61
int tm_min; // 分鐘,0-59
int tm_hour; // 小時, 0-23
int tm_mday; // 日,一個月中的第幾天,1-31
int tm_mon; // 月,從一月算起,0-11,1 + p->tm_mon;
int tm_year; // 年,從1900至今已經多少年,1900 + p->tm_year;
int tm_wday; // 星期,一周中的第幾天,從星期日算起,0-6
int tm_yday; // 從今年1月1日到目前的天數,范圍0-365
int tm_isdst; // 日光節約時間的旗標
};
常用的時間庫函數
常用的時間函數都包含在頭文件 time.h/ctime(C/C++ 版本)中。
time()
time_t time(time_t *ptr);
該函數返回得到當前日歷時間或者設置日歷時間,日歷時間即自格林威治時間(1970-01-01 00:00:00 UTC)起經過的時間,單位為秒。ptr 是一個指向類型為 time_t 對象的指針。如果 ptr 不為空,則返回值存儲在變量 ptr 中。一般給 ptr 傳遞0或者 NULL 值,如果傳遞的是非空地址,也能得到當前的日歷時間。
time_t t1 = time(0);
time_t t2 = time(NULL);
// 等價語句,三個對象存儲的都是同一個數值
time_t t3;
time(&t3);
asctime()
char *asctime(const struct tm *timeptr);
該函數接受一個指向 tm 結構類型常量對象的指針 timeptr,返回一個指向字符串的指針,該字符串包含了可讀格式的日期和時間信息 :
w m d h:m:s y
其中,w 表示星期幾,m 是以字母表示的月份,d 表示一月中的第幾天,h : m : s 表示當前的時間,y 表示年份。asctime 函數常用于將結構中的信息轉換為真實世界的時間,以字符串的形式顯示。它計算得到的是世界統一時間。世界統一時間比北京時間早八個小時。比如當前北京時間是 8:41,利用 asctime 顯示的時間則為 00:41,這意味著日期也有可能會早一天。
gmtime()
struct tm *gmtime(const time_t *timer);
該函數接受一個指向 time_t 類型常量對象的指針 timer,返回一個指向 tm 結構類型的指針。它使用 timer 的值來計算 tm 的各個成員變量,得到的是協調世界時。
ctime()
char *ctime(const time_t *timeptr);
該函數接受一個指向 time_t 類型常量對象的指針 timeptr,返回一個指向字符串的指針,其與 asctime() 的返回類型和格式是一樣的。這兩個函數的區別在于傳入的參數類型不一樣,而且 ctime 返回的是本地時區時間。
localtime()
struct tm *localtime(const time_t *timer);
該函數接受一個指向 time_t 類型常量對象的指針 timer,返回一個指向 tm 結構類型的指針。它使用 timer 的值來計算 tm 的各個成員變量,得到的是“本地時區時間”。
mktime()
time_t mktime(struct tm *timeptr)
該函數接受一個指向 tm 結構類型常量對象的指針 timeptr,返回一個 time_t 類型的無符號整數。它的作用是將 timeptr 所指向的結構體變量轉換成自格林威治時間(1970-01-01 00:00:00 UTC)起經過的時間并返回,單位為秒,若發生錯誤返回-1。
strftime()
size_t strftime(
char *str,
size_t maxsize,
const char *format,
const struct tm *timeptr);
該函數接受一個字符串str、一個無符號整數 maxsize,一個字符串 format 以及一個指向 tm 結構類型常量對象的指針。它的作用是將 timeptr 表示的時間按照格式化規則存儲在 str 中,maxsize 用來表示復制到 str 中的最大字符個數。如果 str 的字符個數(包含空字符 ‘\0’)小于 maxsize,則函數返回其字符個數,否則返回0。
size_t 是一個與機器相關的無符號整數類型,其大小足以保證存儲內存中的任意對象。例如數組下標的類型、vector 下標的類型實際上都是 size_t。
format 是一個 C 字符串,其中包含了普通字符和特殊格式說明符的任何組合。這些格式說明符由 strftime 函數識別,從而將 tm 中每個成員變量(參考前面 tm 結構中定義的各個整數)替換為相應的格式并存入 str 中。下表為格式說明符:
說明符 | 替換為 |
---|---|
%a | 縮寫的星期幾名稱,例如:Sun |
%A | 完整的星期幾名稱,例如:Sunday |
%b | 縮寫的月份名稱,例如:Mar |
%B | 完整的月份名稱,例如:March |
%c | 日期和時間表示法,例如:Sun Aug 19 02:56:02 2012 |
%d | 一月中的第幾天(01-31),例如:19 |
%F | 顯示年-月-日,例如:09-11-03 |
%H | 24 小時格式的小時(00-23),例如:14 |
%I | 12 小時格式的小時(01-12),例如:05 |
%j | 一年中的第幾天(001-366),例如:231 |
%m | 十進制數表示的月份(01-12),例如:08 |
%M | 十進制表示的分鐘數(00-59),例如:55 |
%p | AM 或 PM 名稱,例如:PM |
%r | 12小時的時間,例如:9 |
%R | 小時和分鐘,例如:08:29 |
%S | 秒(00-61),例如:02 |
%U | 一年中的第幾周,以第一個星期日作為第一周的第一天(00-53),例如:33 |
%w | 十進制數表示的星期幾,星期日表示為 0(0-6),例如:4 |
%W | 一年中的第幾周,以第一個星期一作為第一周的第一天(00-53),例如:34 |
%x | 標準日期串,例如:08/19/12 |
%X | 標準時間串,例如:02:50:06 |
%y | 年份的最后兩個數字(00-99),例如:01 |
%Y | 完整的年份,例如:2012 |
%Z | 時區的名稱或縮寫,若得不到時區名稱則返回空串,例如:CDT |
%% | 一個 % 符號,例如:% |
difftime()
double difftime(time_t time1, time_t time2)
該函數接受兩個 time_t 類型的無符號整數并返回它們的差值,單位為秒。
C/C++ 獲取當前(本地)時間的方法
方法一
先獲取格林威治時間,再使用 localtime 函數獲取當前時間的 tm 結構類型變量,將其格式化后存入 str 再打印:
#include <cstdio>
#include <ctime>
int main(void)
{
time_t t = time(0);
char str[64];
strftime(str, sizeof(str), "%Y/%m/%d %X %A 今年第%j天 %z", localtime(&t));
printf("當前時間:%s", str);
return 0;
}
方法二
先獲取格林威治時間,使用 localtime 函數獲取當前時間的 tm 結構類型變量,再將其用 ctime 函數轉換成當前時間的字符串打印輸出:
#include <cstdio>
#include <ctime>
int main(void)
{
time_t t = time(0);
struct tm *info = localtime(&t);
printf("當前時間:%s", ctime(info));
return 0;
}
方法三
先獲取格林威治時間,使用 localtime 函數獲取當前時間的 tm 結構類型變量,然后直接依據 tm 中的成員來計算我們想要打印的內容:
#include <cstdio>
#include <ctime>
int main()
{
char wday[][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
time_t t = time(0); // 獲得time_t結構的時間,世界協調時
struct tm *p;
p = localtime(&t); // 轉換為 struct tm 結構的本地時間
printf("%04d/%02d/%02d ", 1900 + p->tm_year, 1+ p->tm_mon, p->tm_mday); // 打印當前日期
printf("%s %02d:%02d:%02d\n", wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec); // 打印當前時間
return 0;
}
方法四
使用 windows 的 API,能夠精確到毫秒級。但是因為用的是 windows 下的函數,所以換了其他操作系統就不一定能用了:
#include <cstdio>
#include <windows.h>
int main()
{
SYSTEMTIME sys;
GetLocalTime(&sys);
printf("%4d-%02d-%02d %02d:%02d:%02d.%03d 星期%1d",
sys.wYear, sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond, sys.wMilliseconds, sys.wDayOfWeek);
return 0;
}
方法五
利用系統函數,只顯示當前的時間,不顯示年月日這些。而且還能直接修改系統時間:
#include <cstdlib>
int main()
{
system("time");
return 0;
}
原文鏈接:https://blog.csdn.net/qq_37701948/article/details/127652884
相關推薦
- 2023-02-05 Python中import語句用法案例講解_python
- 2022-12-23 C++中關于getchar()的使用方法_C 語言
- 2022-04-20 C#9.0推出的4個新特性介紹_C#教程
- 2022-10-09 C#使用struct類型作為泛型Dictionary<TKey,TValue>的鍵_C#
- 2022-10-08 C#中32位浮點數Float(Real)一步步按位Bit進行分析_C#教程
- 2022-06-07 使用Docker容器部署rocketmq單機的全過程_docker
- 2022-12-05 TensorFlow中關于tf.app.flags命令行參數解析模塊_python
- 2022-05-24 C++基于Floyd算法實現校園導航系統_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支