【问题标题】:Number of seconds since midnight自午夜以来的秒数
【发布时间】:2020-04-17 14:02:06
【问题描述】:

我编写了以下代码来获取自午夜以来的秒数。

但是,我不喜欢 C 时间日期结构。使用标准 C++ 库是否有更简单的方法?

// Get today's date
time_t aTime = time(NULL);

// Set the time to midnight
struct tm* tm = localtime(&aTime);
tm->tm_sec = 0;
tm->tm_min = 0;
tm->tm_hour = 0;
tm->tm_isdst = -1;
time_t midnight = mktime(tm);

// Create object representing now
struct timespec now;
clock_gettime(CLOCK_REALTIME, &now);

// Number of seconds (now) since Epoch
const uint64_t nowSecsSinceEpoch = now.tv_sec;

// Number of seconds (now) since midnight = seconds (now) since Epoch minus seconds (at midnight) since Epoch
const uint64_t nowSecsSinceMidnight = nowSecsSinceEpoch - midnight;

【问题讨论】:

    标签: c++ chrono


    【解决方案1】:

    这取决于您是指从 UTC 午夜开始的时间,还是从当地时间午夜开始的时间,或者可能是在某个非本地、遥远的时区。

    这在 C++20 中也变得更加容易。但是有一个 preview of the C++20 parts of the <chrono> library 可以与 C++11-17 一起使用。

    UTC 午夜后的时间

    #include <chrono>
    #include <iostream>
    
    int
    main()
    {
        using namespace std;
        using namespace std::chrono;
    
        auto now = system_clock::now();
        auto today = floor<days>(now);
        auto tod = duration_cast<seconds>(now - today);
    }
    

    这只是获取当前时间 (UTC),将其截断为天精度 time_point,然后将两者相减并将差值截断为秒精度。

    当地时间午夜后的时间

    #include <chrono>
    #include <iostream>
    
    int
    main()
    {
        using namespace std;
        using namespace std::chrono;
    
        auto now = current_zone()->to_local(system_clock::now());
        auto today = floor<days>(now);
        auto tod = duration_cast<seconds>(now - today);
    }
    

    此版本查找您计算机当前设置的本地时区,然后通过time_zone的to_local()成员函数获取当前本地时间。然后像以前一样继续。

    从另一个午夜开始的时间

    #include <chrono>
    #include <iostream>
    
    int
    main()
    {
        using namespace std;
        using namespace std::chrono;
    
        auto now = locate_zone("Australia/Sydney")->to_local(system_clock::now());
        auto today = floor<days>(now);
        auto tod = duration_cast<seconds>(now - today);
    }
    

    最后,这个版本找到了与澳大利亚悉尼相关联的time_zone,然后使用那个时区并照常进行。

    C++20 preview &lt;chrono&gt; library 是免费和开源的。它将所有内容放在命名空间日期中,并放在两个标题(和一个来源)中:

    • date.h:一个仅包含 UTC 部分的标头库,但不支持时区。

    • tz.h:用于时区支持。这需要some installation

    【讨论】:

    • 都是当地时间
    猜你喜欢
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    相关资源
    最近更新 更多