使用草案 C++20 <chrono> 工具,您可以发现std::chrono::system_clock::time_point 用于任何 时区的下一个UTC 偏移更改,然后std::this_thread::sleep_until 发现time_point。当你醒来时,做任何你想做的事,比如计算一个新的 UTC 偏移量。
新的C++20草案<chrono>库已经原型化,在namespace date下是available as a free, open-source library。该库可跨 VS、gcc 和 clang 移植,并且可在 C++11 及更高版本中运行。
这是如何编码的草图:
#include "date/tz.h"
#include <thread>
template <class F>
void
on_utc_offset_change(date::time_zone const* tz, F f)
{
using namespace date;
using namespace std;
using namespace std::chrono;
while (true)
{
auto info = tz->get_info(system_clock::now());
f(info);
this_thread::sleep_until(info.end);
}
}
time_zone 有一个 get_info(system_clock::time_point) 成员函数,它返回一个 sys_info。 sys_info 包含有关特定时间点 time_zone 的所有信息:
struct sys_info
{
sys_seconds begin;
sys_seconds end;
std::chrono::seconds offset;
std::chrono::minutes save;
std::string abbrev;
};
begin 和 end 成员是 seconds-precision system_clock time_points,它们描绘了 [begin, end) 的范围,此 time_zone 具有此 UTC offset 和缩写 (@987654347 )。
这个函数可能会这样调用:
auto lambda = [](date::sys_info const& info)
{
using namespace date;
std::cerr << "Current UTC offset: " << info.offset << '\n';
std::cerr << "Current tz abbreviation: " << info.abbrev << '\n';
std::cerr << "Sleeping until " << info.end << " UTC\n";
};
std::thread{on_utc_offset_change<decltype(lambda)>,
date::current_zone(),
lambda}.detach();
这会分离一个永远运行的thread,例如,每当计算机当前time_zone(在线程启动时)的UTC偏移量发生变化时,它都会打印出当前信息。
Current UTC offset: -14400s
Current tz abbreviation: EDT
Sleeping until 2018-11-04 06:00:00 UTC
或者,您可以为特定的time_zone 运行此命令,该time_zone 不是计算机当前设置的time_zone:
std::thread{on_utc_offset_change<decltype(lambda)>,
date::locate_zone("America/New_York"),
lambda}.detach();