菜鸟笔记
提升您的技术认知

c 获取当前时间 (std::chrono)-ag真人官方网

在c 11之前要获取当前时间,大多数情况下要使用c语言的time库:

#include 
#include 
#include 
int main()
{
    time_t now = time(null);
    tm* tm_t = localtime(&now);
    std::stringstream ss;
    ss << "year:" << tm_t->tm_year   1900 << " month:" << tm_t->tm_mon   1 << " day:" << tm_t->tm_mday
        << " hour:" << tm_t->tm_hour << " minute:" << tm_t->tm_min << " second:" << tm_t->tm_sec;
    std::cout << ss.str();
    int wait;
    std::cin >> wait;
}

time_t是一个64位的整型。记录的是从1970-01-01 00:00:00到现在经过的时间,精度只能到秒。从tm的结构也能看出来:

struct tm
{
    int tm_sec;   // seconds after the minute - [0, 60] including leap second
    int tm_min;   // minutes after the hour - [0, 59]
    int tm_hour;  // hours since midnight - [0, 23]
    int tm_mday;  // day of the month - [1, 31]
    int tm_mon;   // months since january - [0, 11]
    int tm_year;  // years since 1900
    int tm_wday;  // days since sunday - [0, 6]
    int tm_yday;  // days since january 1 - [0, 365]
    int tm_isdst; // daylight savings time flag
};

要输出真实的日期,需要tm_year 1900, tm_mon 1

当然也可以直接调用系统api,getsystemtime,getlocaltime,精度都到毫秒。注意getsystemtime获取的是utc时间,跟getlocaltime获取的北京时间不同,有8小时时差,需要hour 8才是真实的小时:

    systemtime systime = { 0 };
    getsystemtime(&systime);
    ss << "year:" << systime.wyear << " month:" << systime.wmonth << " day:" << systime.wday
        << " hour:" << systime.whour 8 << " minute:" << systime.wminute << " second:" << systime.wsecond <<" milliseconds:"<< systime.wmilliseconds;
    std::cout << ss.str() << std::endl;

说说c 11中的时间,可以精确到纳秒:

    std::cout << "秒:"<(std::chrono::system_clock::now().time_since_epoch()).count() << std::endl;
    std::cout << "毫秒:" << std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()<(std::chrono::system_clock::now().time_since_epoch()).count() << std::endl;
    std::cout << "纳秒:" << std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count() << std::endl;

std::chrono::system_clock::now() 是当前的时间点

std::chrono::system_clock::now().time_since_epoch()获取到的也是到时间元年(1970-01-01)的时间间隔,可以用std::chrono::duration_cast<>函数可以方便的改变获取到时间的精度。

std::chrono::duration_cast转换的时间与c库中的time函数获取的相同:

c time: 1582891867
秒:1582891867
毫秒:1582891867251
微秒:1582891867251721
纳秒:1582891867252208200

std::chrono::system_clock::now()获取的是时间点std::chrono::time_point,时间点的time_since_epoch成员可以获取当前时间点到时间元年经过的时间。

time_t tnow= std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());也可以转换为c库的时间time_t但是精度就变为秒,相当于std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()

不足之处是没有好的时间格式化方法,不能方便的输出,所以一般是先转为time_t,c的方式来输出,不足之处是只能输出到秒了,不过也是有补足的方法:

    auto now = std::chrono::system_clock::now();
    //通过不同精度获取相差的毫秒数
    uint64_t dis_millseconds = std::chrono::duration_cast(now.time_since_epoch()).count()
        - std::chrono::duration_cast(now.time_since_epoch()).count() * 1000;
    time_t tt = std::chrono::system_clock::to_time_t(now);
    auto time_tm = localtime(&tt);
    char strtime[25] = { 0 };
    sprintf(strtime, "%d-d-d d:d:d d", time_tm->tm_year   1900,
        time_tm->tm_mon   1, time_tm->tm_mday, time_tm->tm_hour,
        time_tm->tm_min, time_tm->tm_sec, (int)dis_millseconds);
    std::cout << strtime << std::endl;

输出时间:
2020-02-28 20:24:08 285

网站地图