2016-07-04 6 views
0

GMTで動作するサーバーアプリケーションがあります。私のアプリケーションはベルリンのタイムゾーンにあるサーバーと通信し、私は時々このサーバーからいくつかのファイルを読みます。そして、私はこのファイルから時間を比較する必要があります。夏時間、冬時間の変化を考慮して、リモートサーバーの時刻をベルリンのタイムゾーンから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

あなたが提案するトピックは異なっています。そして私は尋ねる前にグーグルで見つけました。 – user14416

+0

(質問自体に)あなたの話題がどう違うのかを明確にしてください。 –

答えて

2

おそらく、このfree, open source, C++11/14 timezone libraryが役立つ可能性があります。それを使用して、UTCをローカルタイムゾーンに変換したり、任意のIANA timezoneに変換したり、または任意の2つの間で任意のIANA timezonesに変換することができます。ライブラリは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 here、またはopen an issue hereにここでヘルプを表示、またはメールアドレスを検索し、直接私に連絡することができます。

このライブラリは完全に文書化されており、最新のIANA timezone databaseで最新の状態に保つように設計されています(latest mess the Egyptian politicians have madeが必要な場合でも3日の予告なしにタイムゾーンのルールを変更する必要があります)。あなたのタイムスタンプが古くなった場合(1940年代から)、心配しないでください。このライブラリは、IANAが提供する完全なタイムゾーン履歴をシームレスにサポートします。つまり、IANA timezone databaseにデータがある場合、このライブラリはエラーなく抽出して使用します。

あなたのアプリケーションに役立つ場合は、ベルリンのローカルの日付リテラルを簡単かつ効率的に作成することもできます。たとえば、ここにあなたがベルリンで2016年7月の最初の月曜日に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'; 

出力:

0見つけるためには、何時間ニューヨーク事務所は、この会議のためでは在宅勤務してい

これが役に立ちます。

関連する問題