美文网首页
C++ 格式化日期和时间戳

C++ 格式化日期和时间戳

作者: book_02 | 来源:发表于2021-07-06 21:03 被阅读0次

    1. 格式化日期

    参考:https://blog.csdn.net/K346K346/article/details/47735791

    1.1 说明

    1. 一般步骤为通过localtime函数获取日期信息,通过strftime函数格式化日期
    2. localtime是个线程不安全的函数,因为用到了全局变量。于是有了线程安全的localtime_slocaltime_r
    3. localtime_s是适配windows平台的
    4. localtime_r是适配linux平台的
    5. localtime_slocaltime_r使用时,参数顺序不一样

    1.2 基本用法

    #include <time.h>
    
    time_t t = time(0);
    char tmp[32] = { NULL };
    strftime(tmp, sizeof(tmp), "%Y-%m-%d_%H:%M:%S", localtime(&t));
    string date(tmp);
    
    date: (样例): 2015-04-02_23:12:56
    

    1.3 windows localtime_s

    struct tm stime;
    time_t now = time(0);
    localtime_s(&stime, &now);
    
    char tmp[32] = { NULL };
    strftime(tmp, sizeof(tmp), "%Y-%m-%d_%H:%M:%S", &stime);
    string date(tmp);
    

    1.4 linux localtime_r

    struct tm stime;
    time_t now = time(0);
    localtime_r(&now, &stime);
    
    char tmp[32] = { NULL };
    strftime(tmp, sizeof(tmp), "%Y-%m-%d_%H:%M:%S", &stime);
    string date(tmp);
    

    1.5 通过平台编译宏统一使用

    参考: https://stackoverflow.com/questions/38034033/c-localtime-this-function-or-variable-may-be-unsafe

    inline std::tm localtime_xp(std::time_t timer)
    {
        std::tm bt {};
    #if defined(__unix__)
        localtime_r(&timer, &bt);
    #elif defined(_MSC_VER)
        localtime_s(&bt, &timer);
    #else
        static std::mutex mtx;
        std::lock_guard<std::mutex> lock(mtx);
        bt = *std::localtime(&timer);
    #endif
        return bt;
    }
    
    char tmp[32] = { NULL };
    auto stime = localtime_xp(std::time(0));
    strftime(tmp, sizeof(tmp), "%Y-%m-%d_%H:%M:%S", &stime);
    string date(tmp);
    

    2. 时间戳

    2.1 秒级时间戳

    #include<iostream>
    #include<ctime>
    
    int main()
    {
        std::time_t t = std::time(0);  // t is an integer type
        std::cout << t << " seconds since 01-Jan-1970\n";
        return 0;
    }
    
    1554986565 seconds since 01-Jan-1970
    

    或者

    #include <chrono>
    
    auto now = std::chrono::system_clock::now();
    auto in_time_t = std::chrono::system_clock::to_time_t(now);
    

    2.2 毫秒级时间戳

    #include <time.h>
    #include <chrono>
    
    auto now = std::chrono::system_clock::now();
    std::chrono::time_point<std::chrono::system_clock,std::chrono::milliseconds> tp = std::chrono::time_point_cast<std::chrono::milliseconds>(now);//获取当前时间点
    std::time_t timestamp =  tp.time_since_epoch().count(); //计算距离1970-1-1,00:00的时间长度
    

    c/c++ 标准日期和时间戳互相转化
    https://blog.csdn.net/u011304615/article/details/71713179

    3. 其他

    目前获取日期的方法都不友好,在C++20之后估计会有改善
    https://www.modernescpp.com/index.php/calendar-and-time-zone-in-c-20

    相关文章

      网友评论

          本文标题:C++ 格式化日期和时间戳

          本文链接:https://www.haomeiwen.com/subject/avqnultx.html