自午夜以来的秒数
Number of seconds since midnight
我写了下面的代码来获取自午夜以来的秒数。
但是,我对 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 午夜以来的时间,还是自当地时间午夜以来的时间,或者也许是某个 non-local 遥远时区的时间。
这在 C++20 中也变得更加容易。但是存在一个可以与 C++11-17 一起使用的preview of the C++20 parts of the <chrono>
library。
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),将其截断为 days-precision 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是免费的,open-source。它将所有内容放在名称空间日期中,并放在两个 headers (和一个来源)中:
date.h
:一个 header-only 库,将执行 UTC 部分,但不支持时区。
tz.h
:为时区支持。这需要 some installation.
我写了下面的代码来获取自午夜以来的秒数。
但是,我对 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 午夜以来的时间,还是自当地时间午夜以来的时间,或者也许是某个 non-local 遥远时区的时间。
这在 C++20 中也变得更加容易。但是存在一个可以与 C++11-17 一起使用的preview of the C++20 parts of the <chrono>
library。
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),将其截断为 days-precision 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是免费的,open-source。它将所有内容放在名称空间日期中,并放在两个 headers (和一个来源)中:
date.h
:一个 header-only 库,将执行 UTC 部分,但不支持时区。tz.h
:为时区支持。这需要 some installation.