MFC/C++:需要遥远的"wall clock"时间而不重置系统的时间
MFC/C++: Need distant "wall clock" time without resetting my system's time
我的最终目标是知道当前本地时间("挂钟")时间(纽约)和伦敦时间之间的整数小时数。我在纽约。我已经阅读了有关"时区"结构的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
转移到"欧洲/伦敦"时区。
dp
与tp
相同类型,但精度为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 函数
- c++ 11 如何获取系统时间?
- 如何使用跨平台代码在C++中设置系统时间?
- 如何使用 CTIME/Chrono Libarey 将开始时间与系统时钟进行比较
- 将系统时间与变量进行比较 - C++
- 即使在多任务处理时,添加用户时间 + 系统时间(来自 shell 的时间命令)是否是一种可靠的措施?
- 系统时间从何而来?
- 对于同一任务,线程的等待时间在 0 到 30000 微秒之间系统地切换
- 测量 std::系统的实际执行时间(以 C++ 为单位)
- Qthread ::更改系统时间时睡眠不正常
- 如何在跨平台C++中以毫秒为单位获得系统启动/启动时间(它应该在Windows / IOS / Android / MA
- 查找系统调用需要多长时间的可能方法
- 在C++的主逻辑中接收真实/用户/系统时间
- 为什么在获取系统时间时在此处使用“atomic_signal_fence”
- 使用rdtsc计算系统时间
- 用C++设置windows系统时间
- 如何使用套接字编程获取系统日期和时间
- 最佳C 11测量嵌入式系统代码执行时间的方法
- 具有较低系统时间的C++时序方法
- 不取决于系统时间的时间
- 我如何在C 的毫秒内获得系统的时间