自午夜以来的秒数

时间:2020-04-17 14:02:06

标签: c++ chrono

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

但是,我对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;

1 个答案:

答案 0 :(得分:2)

这取决于您指的是从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 <chrono> library是免费的开放源代码。它将所有内容放入名称空间日期和两个标头(和一个来源)中:

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

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