我的最终目标是知道当前本地(“挂钟”)时间(纽约)和伦敦时间之间的整数小时数。我在纽约。 我已经阅读了关于“TimeZone”结构的MSDN文档。复杂的是夏令时。我希望代码能够在不同于我系统时钟的城市中返回“如果”夏令时。例如,今天是纽约的日光时间,而不是伦敦的日光时间,所以我希望最终知道“4小时”。在一年中的大部分时间里,它是5个小时。 我不能采取路线将我的系统时间暂时设置为英国时间然后差异/读取“日光时间”状态,是/否,因为我的应用程序有许多并发线程非常“挂钟” - 敏感并且会如果系统时间突然提前几个小时,即使只持续几毫秒,也会失控。相反,当前本地标准/日光(我可以自己做)的0/1和远程(伦敦)标准/日光(我需要帮助)的0/1就足够了。或者,当然,只需知道当地时间,伦敦的系统就会显示已选择进行日光调整。
我是C ++的初学者。我的开发环境是Win7:VS2013:C ++:MFC
答案 0 :(得分:2)
GetSystemTime
“以协调世界时(UTC)表示”
这并不总是与伦敦时间相符。英国有夏令时,他们的时钟相对于UTC来回。大多数其他国家都有自己的夏令时,在不同的日期。
GetLocalTime
在纽约或您所在的任何地点给出时间,并进行夏令时调整。
您的程序应该在任何地方使用GetSystemTime
。
如果您想向用户显示日期/时间,请使用SystemTimeToTzSpecificLocalTime
进行转换。
SYSTEMTIME systemTime;
GetSystemTime(&systemTime);
SYSTEMTIME localTime;
SystemTimeToTzSpecificLocalTime(NULL, &systemTime, &localTime);
如果您输入了用户日期/时间,请使用TzSpecificLocalTimeToSystemTime
转换为UTC以供内部程序使用。
答案 1 :(得分:1)
答案 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;时区。
dp
与tp
的类型相同,但精度为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