關(guān)于C++使用std::chrono獲取當(dāng)前秒級(jí)/毫秒級(jí)/微秒級(jí)/納秒級(jí)時(shí)間戳問(wèn)題
1 使用std::chrono獲取當(dāng)前秒級(jí)/毫秒級(jí)/微秒級(jí)/納秒級(jí)時(shí)間戳
1.1 當(dāng)前時(shí)間戳獲取方法
先使用std::chrono獲取當(dāng)前系統(tǒng)時(shí)間,然后將當(dāng)前系統(tǒng)時(shí)間轉(zhuǎn)換為紀(jì)元時(shí)間std::time_t類型,之后使用std::localtime對(duì)std::time_t類型轉(zhuǎn)換為本地時(shí)間結(jié)構(gòu)體std::tm類型,最后使用strftime對(duì)時(shí)間進(jìn)行格式化輸出。
其中std::tm該結(jié)構(gòu)包含了一個(gè)被分解為以下各部分的日歷時(shí)間
struct tm {
int tm_sec; // 秒,范圍從 0 到 59
int tm_min; // 分,范圍從 0 到 59
int tm_hour; // 小時(shí),范圍從 0 到 23
int tm_mday; // 一月中的第幾天,范圍從 1 到 31
int tm_mon; // 月份,范圍從 0 到 11
int tm_year; // 自 1900 起的年數(shù)
int tm_wday; // 一周中的第幾天,范圍從 0 到 6
int tm_yday; // 一年中的第幾天,范圍從 0 到 365
int tm_isdst; // 夏令時(shí)
};而size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)函數(shù)根據(jù)format中定義的格式化規(guī)則,格式化結(jié)構(gòu)timeptr表示的時(shí)間,并把它存儲(chǔ)在str中。
函數(shù)形式
size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)
函數(shù)參數(shù)
- str - 這是指向目標(biāo)數(shù)組的指針,用來(lái)復(fù)制產(chǎn)生的 C 字符串
- maxsize - 這是被復(fù)制到 str 的最大字符數(shù)
- format – 這是C字符串,包含了普通字符和特殊格式說(shuō)明符的任何組合。
這些格式說(shuō)明符由函數(shù)替換為表示tm中所指定時(shí)間的相對(duì)應(yīng)值,具體的格式說(shuō)明符如下所示:
| 格式說(shuō)明符 | 意義 | 例子 |
|---|---|---|
| %a | 縮寫的星期幾名稱 | Sun |
| %A | 完整的星期幾名稱 | Sunday |
| %b | 縮寫的月份名稱 | Mar |
| %B | 完整的月份名稱 | March |
| %c | 日期和時(shí)間表示法 | Sun Aug 19 02:56:02 2012 |
| %C | 年份的前兩位數(shù)字 | |
| %d | 一月中的第幾天(01-31) | 19 |
| %D | 月/天/年 | |
| %e | 在兩字符域中,十進(jìn)制表示的每月的第幾天 | |
| %F | 年-月-日 | |
| %g | 年份的后兩位數(shù)字,使用基于周的年 | |
| %G | 年份,使用基于周的年 | |
| %h | 簡(jiǎn)寫的月份名 | |
| %H | 24 小時(shí)格式的小時(shí)(00-23) | 14 |
| %I | 12 小時(shí)格式的小時(shí)(01-12) | 05 |
| %j | 一年中的第幾天(001-366) | 231 |
| %m | 十進(jìn)制數(shù)表示的月份(01-12) | 08 |
| %M | 分(00-59) | 55 |
| %p | AM 或 PM 名稱 | PM |
| %r | 12小時(shí)的時(shí)間 | |
| %R | 顯示小時(shí)和分鐘:hh:mm | |
| %S | 秒(00-61) | 02 |
| %t | 水平制表符 | |
| %T | 顯示時(shí)分秒:hh:mm:ss | |
| %u | 每周的第幾天,星期一為第一天 (值從1到7,星期一為1) | |
| %U | 一年中的第幾周,以第一個(gè)星期日作為第一周的第一天(00-53) | 33 |
| %V | 每年的第幾周,使用基于周的年 | |
| %w | 十進(jìn)制數(shù)表示的星期幾,星期日表示為 0(0-6) | 4 |
| %W | 一年中的第幾周,以第一個(gè)星期一作為第一周的第一天(00-53) | 34 |
| %x | 日期表示法 | 08/19/12 |
| %X | 時(shí)間表示法 | 02:50:06 |
| %y | 年份,最后兩個(gè)數(shù)字(00-99) | 01 |
| %Y | 年份 | 2012 |
| %Z | 時(shí)區(qū)的名稱或縮寫 | CDT |
| %% | 一個(gè) % 符號(hào) | % |
1.2 獲取當(dāng)前時(shí)間戳函數(shù)
獲取當(dāng)前時(shí)間戳函數(shù)如下,函數(shù)形式
std::string GetCurrentTimeStamp(int time_stamp_type = 0)
函數(shù)參數(shù)
- time_stamp_type - 需要獲取的時(shí)間戳的級(jí)別,0表示秒級(jí)時(shí)間戳,1表示毫秒級(jí)時(shí)間戳,2表示微秒級(jí)時(shí)間戳,3表示納秒級(jí)時(shí)間戳
函數(shù)返回值返回當(dāng)前時(shí)間戳字符串。
該函數(shù)使用示例如下:
#include <ctime>
#include <string>
#include <chrono>
#include <sstream>
#include <iostream>
std::string GetCurrentTimeStamp(int time_stamp_type = 0)
{
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
std::time_t now_time_t = std::chrono::system_clock::to_time_t(now);
std::tm* now_tm = std::localtime(&now_time_t);
char buffer[128];
strftime(buffer, sizeof(buffer), "%F %T", now_tm);
std::ostringstream ss;
ss.fill('0');
std::chrono::milliseconds ms;
std::chrono::microseconds cs;
std::chrono::nanoseconds ns;
switch (time_stamp_type)
{
case 0:
ss << buffer;
break;
case 1:
ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()) % 1000;
ss << buffer << ":" << ms.count();
break;
case 2:
ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()) % 1000;
cs = std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch()) % 1000000;
ss << buffer << ":" << ms.count() << ":" << cs.count() % 1000;
break;
case 3:
ms = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()) % 1000;
cs = std::chrono::duration_cast<std::chrono::microseconds>(now.time_since_epoch()) % 1000000;
ns = std::chrono::duration_cast<std::chrono::nanoseconds>(now.time_since_epoch()) % 1000000000;
ss << buffer << ":" << ms.count() << ":" << cs.count() % 1000 << ":" << ns.count() % 1000;
break;
default:
ss << buffer;
break;
}
return ss.str();
}
int main()
{
std::cout << GetCurrentTimeStamp(0) << std::endl;
std::cout << GetCurrentTimeStamp(1) << std::endl;
std::cout << GetCurrentTimeStamp(2) << std::endl;
std::cout << GetCurrentTimeStamp(3) << std::endl;
return 0;
}結(jié)果輸出:
2022-05-27 14:35:58
2022-05-27 14:35:58:879
2022-05-27 14:35:58:879:200
2022-05-27 14:35:58:879:200:100
到此這篇關(guān)于C++使用std::chrono獲取當(dāng)前秒級(jí)/毫秒級(jí)/微秒級(jí)/納秒級(jí)時(shí)間戳的文章就介紹到這了,更多相關(guān)C++使用std::chrono獲取時(shí)間戳內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- c++打印封裝每次打印前面加上時(shí)間戳問(wèn)題
- C/C++實(shí)現(xiàn)重置文件時(shí)間戳
- C++?std::chrono庫(kù)使用示例(實(shí)現(xiàn)C++?獲取日期,時(shí)間戳,計(jì)時(shí)等功能)
- C++ 中時(shí)間與時(shí)間戳的轉(zhuǎn)換實(shí)例詳解
- C++時(shí)間戳轉(zhuǎn)化操作實(shí)例分析【涉及GMT與CST時(shí)區(qū)轉(zhuǎn)化】
- C++時(shí)間戳轉(zhuǎn)換成日期時(shí)間的步驟和示例代碼
- c++之time_t和struct tm及時(shí)間戳的正確使用方式
相關(guān)文章
C語(yǔ)言中的函數(shù)指針學(xué)習(xí)筆記
這篇文章主要介紹了C語(yǔ)言中的函數(shù)指針的一些學(xué)習(xí)知識(shí)點(diǎn)記錄,文中作者整理了一些比較interesting的函數(shù)指針用法,需要的朋友可以參考下2016-04-04
詳解C語(yǔ)言如何實(shí)現(xiàn)雙向帶頭循環(huán)鏈表
雙向帶頭循環(huán)鏈表應(yīng)該是鏈表中非常方便的一種,可以很容易的在任意位置上進(jìn)行插入和刪除,可以很容易的對(duì)鏈表進(jìn)行管理。本文將利用C語(yǔ)言實(shí)現(xiàn)雙向帶頭循環(huán)鏈表,需要的可以參考一下2022-08-08
C語(yǔ)言實(shí)現(xiàn)撲克牌計(jì)算24點(diǎn)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言如何實(shí)現(xiàn)撲克牌計(jì)算24點(diǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10
詳解C++編程中的靜態(tài)成員與可變數(shù)據(jù)成員
這篇文章主要介紹了詳解C++編程中的靜態(tài)成員與可變數(shù)據(jù)成員,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-01-01
圖文詳解C語(yǔ)言位運(yùn)算基礎(chǔ)知識(shí)
這篇文章主要以圖文結(jié)合的方式為大家詳細(xì)介紹了C語(yǔ)言位運(yùn)算基礎(chǔ)知識(shí),感興趣的小伙伴們可以參考一下2016-07-07
淺談C++日志系統(tǒng)log4cxx的使用小結(jié)詳解
本篇文章是對(duì)C++日志系統(tǒng)log4cxx的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05

