MFC/C++:需要遥远的"wall clock"时间而不重置系统的时间

MFC/C++: Need distant "wall clock" time without resetting my system's time

本文关键字:时间 系统 clock wall 遥远 C++ MFC      更新时间:2023-10-16

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

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

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

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

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

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

如果要向用户显示日期/时间,请使用SystemTimeToTzSpecificLocalTime进行转换。

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

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

使用 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() << "hn";
    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() << "hn";
    diff = floor<hours>(zLondon->to_local(system_clock::now()) -
                      zNew_York->to_local(system_clock::now()));
    std::cout << diff.count() << "hn";
}

今日产出(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是一个小时-分钟-秒-亚秒结构(带有那些getter),标志着当前的伦敦时间。

这一切都可以像这样用来找出市场是否开放(这个简单的示例代码忽略了假期,但考虑到了周末):

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

这只是为我输出:

It is currently Thu 2016-03-31 16:39:15.656398
Markets closed
您可以使用

GetDynamicTimeZoneInformation 函数