C++中DST变化的检测 我正在研究C++实时应用程序,它正在进行大量的数据操作。出于性能原因,我将UTC偏移量设置为可配置值,在应用程序初始化时只读取一次。但它在DST区域引发了问题

C++中DST变化的检测 我正在研究C++实时应用程序,它正在进行大量的数据操作。出于性能原因,我将UTC偏移量设置为可配置值,在应用程序初始化时只读取一次。但它在DST区域引发了问题,c++,linux,timezone,dst,timezone-offset,C++,Linux,Timezone,Dst,Timezone Offset,当DST发生变化时,我的UTC偏移量变量包含错误的值。 对我来说,每次计算偏移量都不是最佳解决方案 那么,是否有必要通知我的应用程序有关DST的更改?因此,我只能在需要修改时计算偏移量。使用草稿C++20工具,您可以发现任何时区下一次UTC偏移量更改的std::chrono::system\u clock::time\u点,然后std::this\u thread::sleep\u直到该时间点。当你醒来时,做任何你想做的事情,比如计算一个新的UTC偏移量 新的草案C++20库已经原型化,并处于名

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

那么,是否有必要通知我的应用程序有关DST的更改?因此,我只能在需要修改时计算偏移量。

使用草稿C++20工具,您可以发现任何时区下一次UTC偏移量更改的std::chrono::system\u clock::time\u点,然后std::this\u thread::sleep\u直到该时间点。当你醒来时,做任何你想做的事情,比如计算一个新的UTC偏移量

新的草案C++20库已经原型化,并处于名称空间日期下。该库可以跨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);
    }
}
begin和end成员是秒精度系统时钟时间点,描绘了该时区具有UTC偏移和缩写abbrev的范围[begin,end]

此函数的调用方式如下:

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();
或者,您也可以针对特定时区运行此操作,该时区不是计算机当前设置的时区,具有:


您需要两个设置:地区或国家,它决定何时发生DST更改。以及当前时区,它定义了与UTC的标准时间偏移。如果DST在第一个设置中是已知的,则在由时区计算的当前本地时间上添加一小时。但是,一旦完成所有设置,则抛出代码h处理时间和时区。时间和日期比看起来要困难得多,所以我真的建议你尝试找到一个能为你处理所有事情的库。这会有帮助吗?关于计算偏移量部分:你可以计算下一次DST更改的时间戳并缓存它。然后每次你使用时间,你只需将它与缓存的时间戳进行比较。如果更低,DST没有改变,如果更高,更新你的偏移量并计算下一个DST改变。谢谢你的回答。我没有选择升级编译器。甚至连C++11都没有?!我最诚挚的哀悼。
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();
Current UTC offset: -14400s
Current tz abbreviation: EDT
Sleeping until 2018-11-04 06:00:00 UTC
std::thread{on_utc_offset_change<decltype(lambda)>,
            date::locate_zone("America/New_York"),
            lambda}.detach();