检测C ++中的DST更改

时间:2018-07-04 10:14:41

标签: c++ linux timezone dst timezone-offset

我正在从事c ++实时应用程序,它正在执行许多日期操作。出于性能原因,我将UTC偏移量设置为可配置值,在应用程序初始化时仅读取一次。但这在DST区域中引起问题。

发生DST更改时,我的UTC偏移量变量包含错误的值。 每次计算偏移量都不是我的最佳解决方案。

因此,是否有任何通知DST更改的应用程序?所以我只能在需要修改时才计算偏移量。

1 个答案:

答案 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_infosys_info包含有关特定时间点的time_zone的所有信息:

struct sys_info
{
    sys_seconds          begin;
    sys_seconds          end;
    std::chrono::seconds offset;
    std::chrono::minutes save;
    std::string          abbrev;
};

beginend成员是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