c++ - 自午夜以来的秒数

标签 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;

最佳答案

这取决于您是指自 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是免费和开源的。它将所有内容放在 namespace 日期和两个标题(和一个源)中:
  • date.h :将执行 UTC 部分的仅 header 库,但不支持时区。
  • tz.h : 对于时区支持。这需要 some installation .
  • 关于c++ - 自午夜以来的秒数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61273498/

    相关文章:

    c++ - 为什么在 C++ 中使用了 NULL?

    c++ - 如何将 std::chrono::time_point 转换为带有小数秒的日历日期时间字符串?

    c++ - std::chrono::high_resolution_clock 的分辨率与测量值不对应

    C++:存储复制操作不合理或不可能的资源

    c++ - 将代码从一台机器复制到另一台机器会产生流浪字符

    c++ - C++ 中 void(*)() 和 void(&)() 的区别

    C++ 使用关系运算符比较字符串

    c++ - 为什么 chrono 有自己的命名空间?

    c++ - std::adjacent_difference 与 std::chrono time_point

    c++ - 如果 d > 255,为什么未指定 std::chrono::day 存储值