• 欢迎大家交换友链,可在https://www.stubbornhuang.com/申请友情链接进行友链交换申请!

  • 感谢大家访问本站,希望本站的内容可以帮助到大家!

  • 计算机图形学与计算几何经典必备书单整理,下载链接可参考:https://www.stubbornhuang.com/1256/

  • 本站会放置Google广告用于维持域名以及网站服务器费用。

  • 问题反馈可发送邮件到stubbornhuang@qq.com

  • 如果觉得本站的内容有帮助,可以考虑打赏博主哦!

  • 工资「喂饱肚子」,副业「养活灵魂」!

  • 在本站开通年度VIP,无限制下载本站资源和阅读本站文章

  • 本站由于前段时间遭受到大量临时和国外邮箱注册,所以对可注册的邮箱类型进行了限制!

C++ – 使用std::chrono获取当前秒级/毫秒级/微秒级/纳秒级时间戳

C++ 发布于2022-05-27 阅读 13,455次 0次评论 1次点赞 本文共3118个字,阅读需要8分钟。

1 使用std::chrono获取当前秒级/毫秒级/微秒级/纳秒级时间戳

1.1 当前时间戳获取方法

先使用std::chrono获取当前系统时间,然后将当前系统时间转换为纪元时间std::time_t类型,之后使用std::localtimestd::time_t类型转换为本地时间结构体std::tm类型,最后使用strftime对时间进行格式化输出。

其中std::tm该结构包含了一个被分解为以下各部分的日历时间

struct tm {
   int tm_sec;         // 秒,范围从 0 到 59
   int tm_min;         // 分,范围从 0 到 59
   int tm_hour;        // 小时,范围从 0 到 23
   int tm_mday;        // 一月中的第几天,范围从 1 到 31
   int tm_mon;         // 月份,范围从 0 到 11
   int tm_year;        // 自 1900 起的年数
   int tm_wday;        // 一周中的第几天,范围从 0 到 6
   int tm_yday;        // 一年中的第几天,范围从 0 到 365
   int tm_isdst;       // 夏令时
};

size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)函数根据format中定义的格式化规则,格式化结构timeptr表示的时间,并把它存储在str中。

函数形式

size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)

函数参数

  • str - 这是指向目标数组的指针,用来复制产生的 C 字符串
  • maxsize - 这是被复制到 str 的最大字符数
  • format -- 这是C字符串,包含了普通字符和特殊格式说明符的任何组合。

这些格式说明符由函数替换为表示tm中所指定时间的相对应值,具体的格式说明符如下所示:

格式说明符 意义 例子
%a 缩写的星期几名称 Sun
%A 完整的星期几名称 Sunday
%b 缩写的月份名称 Mar
%B 完整的月份名称 March
%c 日期和时间表示法 Sun Aug 19 02:56:02 2012
%C 年份的前两位数字
%d 一月中的第几天(01-31) 19
%D 月/天/年
%e 在两字符域中,十进制表示的每月的第几天
%F 年-月-日
%g 年份的后两位数字,使用基于周的年
%G 年份,使用基于周的年
%h 简写的月份名
%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小时的时间
%R 显示小时和分钟:hh:mm
%S 秒(00-61) 02
%t 水平制表符
%T 显示时分秒:hh:mm:ss
%u 每周的第几天,星期一为第一天 (值从1到7,星期一为1)
%U 一年中的第几周,以第一个星期日作为第一周的第一天(00-53) 33
%V 每年的第几周,使用基于周的年
%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
%% 一个 % 符号 %

1.2 获取当前时间戳函数

获取当前时间戳函数如下,
函数形式

std::string GetCurrentTimeStamp(int time_stamp_type = 0)

函数参数

  • time_stamp_type - 需要获取的时间戳的级别,0表示秒级时间戳,1表示毫秒级时间戳,2表示微秒级时间戳,3表示纳秒级时间戳

函数返回值
返回当前时间戳字符串。

该函数使用示例如下:

#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;
}

结果输出:

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

欢迎扫码关注我的微信公众号,及时获取文章更新

微信公众号二维码

本文作者:StubbornHuang

版权声明:本文为站长原创文章,如果转载请注明原文链接!

原文标题:C++ – 使用std::chrono获取当前秒级/毫秒级/微秒级/纳秒级时间戳

原文链接:https://www.stubbornhuang.com/2141/

发布于:2022年05月27日 14:37:25

修改于:2023年06月26日 20:02:23

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

文章末尾
上一篇
C++ - 动态链接库dll为什么要使用unsigned char作为byte的内部格式
C++
下一篇
WordPress - 用户修改密码/邮箱时禁止向管理员/用户发送通知邮件
WordPress
当前分类随机文章推荐

发表评论

您必须 [ 登录 ] 才能发表留言!

关注我们的公众号

微信公众号