2016-03-21 14 views
1

我的最終目標是要知道當前本地(「掛鐘」)時間(在紐約)和同一時間之間的整數小時數倫敦。我在紐約。 我已閱讀了可用於「TimeZone」結構的MSDN文檔。併發症是日光時間。我希望能夠在不同於我係統時鐘設置的城市中返回「if」夏令時的代碼。例如,今天是紐約的夏令時間,但不是(倫敦時間)的日光時間,所以我希望最終知道「4小時」。一年中的大部分時間是5個小時。 我不能採取路由來暫時將我的系統時間設置爲英國時間,然後區別/讀取「日光時間」狀態,是/否,因爲我的應用程序具有許多併發線程,這些併發線程非常「掛鐘」如果系統時間突然提前幾個小時,即使只有幾毫秒,也會失靈。相反,當前本地標準/日光(我可以自己做)的0/1和遙遠(倫敦)標準/日光(我需要幫助)的0/1就足夠了。或者,當然,簡單地知道倫敦的一個系統將顯示當地時間選擇進行日光調整。MFC/C++:需要遙遠的「掛鐘」時間而不需要重置我的系統時間

我是C++的初學者。我的開發環境是Win7的:VS2013:C++:MFC

回答

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 /月/ 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是標記當前倫敦時間的小時 - 分秒 - 亞秒結構(帶有那些獲取者)。

這一切都可以像這樣使用,以找出是否是一個市場開放與否(這個簡單的示例代碼忽略了假期,但需要週末考慮在內),

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 
+0

非常感謝你! – cjv

+0

完美。請知道我儘量不要求這樣的具體幫助,我非常感激,當它是自由的。 – cjv

+0

@cjv:你可以交流,這個答案是通過「接受」它來幫助你最多的答案。這是通過點擊答案的投票分數下的複選標記來完成的。很高興我能幫上忙。 –

1

可以使用GetDynamicTimeZoneInformation功能

+0

謝謝,但是當我早些時候讀到它時,我需要先將系統的時區設置爲其他(倫敦)時區,因爲它指向系統而不是接受動態輸入。 – cjv

2

GetSystemTime「在協調世界時(UTC)表示」

這並不總是符合倫敦時間。英國有夏時制,他們的時鐘相對於UTC來回移動。大多數其他國家都有自己的日光節約時間,這些節日在不同的日期。

GetLocalTime給出了紐約時間或您所在的位置,以及夏令時調整。

你的程序在任何地方都應該使用GetSystemTime

當您想向用戶顯示日期/時間時,請使用SystemTimeToTzSpecificLocalTime進行轉換。

SYSTEMTIME systemTime; 
GetSystemTime(&systemTime); 

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

如果你得到用戶的日期/時間輸入,使用TzSpecificLocalTimeToSystemTime轉換爲UTC內部程序使用。