我编写了以下代码来获取自午夜以来的秒数。
但是,我对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一起使用。
<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);
}
是免费的开放源代码。它将所有内容放入名称空间日期和两个标头(和一个来源)中:
C++20 preview <chrono>
library:仅标头的库,将用作UTC部分,但不支持时区。
<chrono>
:用于时区支持。这需要date.h
。