MFC / C ++:需要远程“挂钟”时间而不重置系统的时间

时间:2016-03-21 11:29:20

标签: c++ time mfc

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

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

3 个答案:

答案 0 :(得分:2)

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

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

GetLocalTime在纽约或您所在的任何地点给出时间,并进行夏令时调整。

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

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

SYSTEMTIME systemTime;
GetSystemTime(&systemTime);

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

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

答案 1 :(得分:1)

您可以使用enter image description here功能

答案 2 :(得分:1)

使用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是&#34;本地&#34; std::chrono::time_point转移到&#34;欧洲/伦敦&#34;时区。

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