【问题标题】:MFC/C++: Need distant "wall clock" time without resetting my system's timeMFC/C++:需要遥远的“挂钟”时间而不重置我的系统时间
【发布时间】:2016-07-07 21:24:49
【问题描述】:

我的最终目标是了解当前本地(“挂钟”)时间(纽约)与伦敦时间之间的整数小时数。我在纽约。 我已通读 MSDN 文档中有关可用的“TimeZone”结构。并发症是夏令时。我希望代码能够在与我的系统时钟设置不同的城市返回“如果”夏令时。例如,今天是纽约的夏令时,但伦敦的(还不是)夏令时,所以我希望最终知道“4 小时”。一年中的大部分时间是 5 小时。 我无法将我的系统时间暂时设置为英国时间,然后区分/读取“日光时间”状态,是/否,因为我的应用程序有许多对“挂钟”非常敏感的并发线程,并且会如果系统时间突然提前几个小时,即使只有几毫秒,也会出现问题。相反,当前本地标准/日光(我可以自己做)的 0/1 和遥远(伦敦)标准/日光(我需要帮助)的 0/1 就足够了。或者,当然,只要知道伦敦系统在选择进行日光调整后会显示的当地时间。

我是 C++ 的相对初学者。我的开发环境是Win7:VS2013:C++:MFC

【问题讨论】:

    标签: c++ time mfc


    【解决方案1】:

    你可以使用GetDynamicTimeZoneInformation函数

    【讨论】:

    • 谢谢,但是当我早些时候读到它时,我需要先将系统的时区设置为另一个(伦敦)时区,因为它指向系统而不是接受动态输入。
    【解决方案2】:

    GetSystemTime “以协调世界时 (UTC) 表示”

    这并不总是与伦敦时间一致。英国有夏令时,他们的时钟相对于 UTC 来回走动。大多数其他国家/地区都有自己的夏令时,日期不同。

    GetLocalTime 提供纽约时间或您所在的任何地方的时间,并带有夏令时调整。

    您的程序应该在任何地方使用GetSystemTime

    当您想向用户显示日期/时间时,请使用SystemTimeToTzSpecificLocalTime 进行转换。

    SYSTEMTIME systemTime;
    GetSystemTime(&systemTime);
    
    SYSTEMTIME localTime;
    SystemTimeToTzSpecificLocalTime(NULL, &systemTime, &localTime);
    

    如果您获得用户日期/时间输入,请使用 TzSpecificLocalTimeToSystemTime 转换为 UTC 以供内部程序使用。

    【讨论】:

      【解决方案3】:

      使用https://github.com/HowardHinnant/date(适用于 VS-2013):

      #include <iostream>
      #include "tz.h"
      
      int
      main()
      {
          using namespace date;
          using namespace std::chrono;
          auto zLondon   = locate_zone("Europe/London");
          auto zNew_York = locate_zone("America/New_York");
          auto diff = floor<hours>(zLondon->to_local(sys_days{2016_y/mar/21}) -
                                 zNew_York->to_local(sys_days{2016_y/mar/21}));
          std::cout << diff.count() << "h\n";
      
          diff = floor<hours>(zLondon->to_local(sys_days{2016_y/jun/21}) -
                            zNew_York->to_local(sys_days{2016_y/jun/21}));
          std::cout << diff.count() << "h\n";
      
          diff = floor<hours>(zLondon->to_local(system_clock::now()) -
                            zNew_York->to_local(system_clock::now()));
          std::cout << diff.count() << "h\n";
      }
      

      今天的输出(2016 年 3 月 28 日):

      4h
      5h
      4h
      

      要确定不是您计算机本地时间的区域中的本地时间,可以这样做:

      auto zLondon = locate_zone("Europe/London");
      auto tp = zLondon->to_local(system_clock::now());
      auto dp = floor<days>(tp);
      weekday wd = dp;
      year_month_day ymd = dp;
      auto time = make_time(tp-dp);
      

      tp 是转移到“欧洲/伦敦”时区的“本地”std::chrono::time_point

      dptp 的类型相同,但精度为 days 而不是 microseconds(或其他)。

      wd 是伦敦一周中的当前日期。

      ymd 是伦敦当前时间的年-月-日结构(带有年、月和日获取器)。

      time 是一个小时-分钟-秒-亚秒结构(带有这些吸气剂),标记当前伦敦时间。

      这一切都可以用来确定市场是否开放(这个简单的示例代码忽略了节假日,但将周末考虑在内):

      std::cout << "It is currently " << wd << ' ' << ymd << ' ' << time << '\n';
      if (wd != sat && wd != sun && 9h <= time.hours() && time.hours() < 16h)
          std::cout << "Markets open\n";
      else
          std::cout << "Markets closed\n";
      

      这只是为我输出:

      It is currently Thu 2016-03-31 16:39:15.656398
      Markets closed
      

      【讨论】:

      • 完美运行。请知道我尽量不要求这种具体的帮助,当它免费提供时我非常感激。
      • @cjv:您可以通过“接受”它来传达这个答案对您的帮助最大。这可以通过单击答案得分下方的复选标记来完成。很高兴我能帮上忙。
      • 完成!我的应用程序是一个多机器人交易系统,其中一个机器人/线程需要知道伦敦的某个市场是否开放(那里在上午 9 点开放)(已经知道那里是否是工作日假期)。再次感谢,非常好的人。
      • 感谢您返回并添加额外的代码。我正在处理的问题在自动交易编码器中必须是“常见的”。我一直在配置文件中即兴创作“system_time + 4/5 hours”,但这对于心不在焉的情况并不可靠。
      猜你喜欢
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多