午夜以来的秒数

问题描述 投票:6回答:1

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

但是,我对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个回答
2
投票

这取决于您是指从UTC午夜开始的时间,还是当地时间午夜以来的时间,或者是某个非本地的较远时区。

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

UTC午夜以来的时间

<chrono>

[这只是获得当前时间(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); } ,然后将两者相减并将其时差截断为秒精度。

自当地午夜以来的时间

time_point

此版本查找计算机当前设置的本地时区,然后通过time_zone的#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); } 成员函数获取当前本地时间。然后像以前一样进行。

自其他午夜以来的时间

to_local()

最后,此版本将找到与澳大利亚悉尼关联的time_zone,然后使用that时区,并像以前一样进行。

#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); } 是免费的开放源代码。它将所有内容放入名称空间日期和两个标头(和一个来源)中:

© www.soinside.com 2019 - 2024. All rights reserved.