2016-07-04 110 views
0

我有一個在GMT工作的服務器應用程序。我的應用程序與柏林時區的服務器通信,我不時從該服務器讀取一些文件。我需要比較這些文件的時間。考慮到夏季和冬季時間的變化,我如何將遠程服務器的時間從柏林時區轉換爲格林威治時間?你知道mb從boost.date_time什麼東西可以幫助我輕鬆做到嗎?時區之間的時間轉換

我不是想從當地時間轉換爲gmt。我正在從一個特定的時區轉換到gmt。我需要有一個強大的方式來處理不同的時區。

+0

[可能的重複](http://stackoverflow.com/questions/761791/converting-between-local-times-and-gmt-utc-in-c-c)。 Google是你的朋友。 –

+0

您建議的主題不同。之前我問過Google。 – user14416

+0

您能否澄清一下(在問題本身中)爲什麼您的主題不同? –

回答

2

也許這free, open source, C++11/14 timezone library可能會有所幫助。您可以使用它將UTC轉換爲本地時區或從本地時區轉換爲任意IANA timezone,或轉換爲任意兩個任意IANA timezones之間的UTC。該庫已被移植到gcc,clang和VS.但它需要<chrono>

下面是如何獲取當前UTC時間,將其轉換爲柏林當地時間,然後將柏林當地時間轉換爲當地時間,然後將柏林當地時間轉換回UTC的簡短示例。這是所有很簡單,用現代C++的語法和類型安全:

#include "tz.h" 
#include <iostream> 

int 
main() 
{ 
    using namespace date; 
    using namespace std::chrono; 
    auto utc = system_clock::now(); 
    auto berlin = make_zoned("Europe/Berlin", utc); 
    auto local = make_zoned(current_zone(), berlin); 
    auto utc2 = berlin.get_sys_time(); 
    std::cout << format("%F %T %Z", utc) << '\n'; 
    std::cout << format("%F %T %Z", berlin) << '\n'; 
    std::cout << format("%F %T %Z", local) << '\n'; 
    std::cout << format("%F %T %Z", utc2) << '\n'; 
} 

這只是對我輸出:

2016-07-05 01:41:29.207335 UTC 
2016-07-05 03:41:29.207335 CEST 
2016-07-04 21:41:29.207335 EDT 
2016-07-05 01:41:29.207335 UTC 

是的,你甚至可以轉換時區與任何精密您std::chrono::sytem_clock支持,並解析並將其精確格式化。

如果這個庫給你帶來麻煩,你可以在這裏獲得關於堆棧溢出的幫助,或chat hereopen an issue here,或者搜索我的電子郵件地址並直接與我聯繫。

此庫有完整的文檔記錄,並且設計用於與最新的IANA timezone database保持同步(即使您需要latest mess the Egyptian politicians have made - 通過提前3天提前通知來更改時區規則)。如果你的時間戳是過時的(比如從20世紀40年代開始),不要擔心。該庫無縫支持IANA提供的完整時區歷史記錄。也就是說,如果IANA timezone database中有數據,則此庫將無誤地提取並使用它。

如果這對您的應用程序有幫助,您還可以輕鬆高效地在柏林本地創建日期文字。例如,這裏是你將如何在七月2016年在柏林的第一個星期一指定15:30(<chrono>文字需要C++ 14):

auto meet = make_zoned("Europe/Berlin", local_days{2016_y/jul/mon[1]} + 15h + 30min); 
std::cout << meet << '\n'; 

輸出:

2016-07-04 15:30:00 CEST 

如果你想找出什麼時間紐約辦事處擁有遠程辦公在本次會議:

std::cout << make_zoned("America/New_York", meet) << '\n'; 

輸出:

2016-07-04 09:30:00 EDT 

希望這會有所幫助。