我正在从事c ++实时应用程序,它正在执行许多日期操作。出于性能原因,我将UTC偏移量设置为可配置值,在应用程序初始化时仅读取一次。但这在DST区域中引起问题。
发生DST更改时,我的UTC偏移量变量包含错误的值。 每次计算偏移量都不是我的最佳解决方案。
因此,是否有任何通知DST更改的应用程序?所以我只能在需要修改时才计算偏移量。
答案 0 :(得分:0)
使用草稿C ++ 20 <chrono>
工具,您可以找到std::chrono::system_clock::time_point
,用于 any 时区的下一个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
精度system_clock
time_point
,它描述了{{1 }}具有这个UTC [begin, end)
和缩写(time_zone
)。
此函数可能像这样被调用:
offset
这会分离一个永久运行的abbrev
,并且每次UTC偏移针对计算机当前的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();
(在线程启动时)更改时,它都会打印出当前信息。例如,< / p>
thread
或者,您可以针对特定的time_zone
(不是计算机当前设置的Current UTC offset: -14400s
Current tz abbreviation: EDT
Sleeping until 2018-11-04 06:00:00 UTC
)运行此命令:
time_zone