2016-07-04 13 views
0

Ich habe eine Server-Anwendung, die in GMT funktioniert. Meine Anwendung kommuniziert mit einem Server in der Berliner Zeitzone, ich lese von Zeit zu Zeit einige Dateien von diesem Server. Und ich muss die Zeiten von diesen Dateien vergleichen. Wie kann ich die Zeit des Remote-Servers von der Zeitzone Berlin in GMT unter Berücksichtigung von Sommer- und Winterzeitumstellungen umrechnen? Weißt du, mb etwas von boost.date_time kann mir helfen, es leicht zu machen?Zeit Umwandlung zwischen Zeitzonen

Ich versuche nicht, von Ortszeit in GMT umzuwandeln. Ich konvertiere von einer bestimmten Zeitzone in GMT. Ich muss einen robusten Weg haben, dies mit verschiedenen Zeitzonen zu tun.

+0

[Mögliches Duplikat] (http://stackoverflow.com/questions/761791/converting-between-local-times-and-gmt-utc-in-c-c). Google ist dein Freund. –

+0

Das von Ihnen vorgeschlagene Thema ist anders. Und ich habe gegoogelt, bevor ich gefragt habe. – user14416

+0

Könnten Sie bitte (in der Frage selbst) klären, warum ist Ihr Thema anders? –

Antwort

2

Vielleicht könnte dies free, open source, C++11/14 timezone library helfen. Sie können es verwenden, um UTC in oder von Ihrer lokalen Zeitzone in oder von einem beliebigen oder zwischen zwei beliebigen IANA timezones zu konvertieren. Die Bibliothek wurde nach gcc, clang und VS portiert. Aber es erfordert <chrono>.

Hier ist ein kurzes Beispiel, wie Sie die aktuelle UTC-Zeit erhalten, diese in Berliner Ortszeit konvertieren, dann die Berliner Ortszeit in Ihre Ortszeit umrechnen und dann die Berliner Ortszeit in UTC umrechnen. Es ist alles ganz einfach, modern C++ Syntax und Art mit Sicherheit:

#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'; 
} 

Dies ist nur Ausgang für mich:

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 

Ja, können Sie sogar überZeitZonen mit dem, was Präzision Ihrer std::chrono::sytem_clock unterstützt und analysieren und formatiere diese Genauigkeit.

Wenn diese Bibliothek Ihnen Probleme bereitet, können Sie Hilfe hier auf Stack-Überlauf oder chat here oder open an issue here, oder suchen Sie nach meiner E-Mail-Adresse und kontaktieren Sie mich direkt.

Diese Bibliothek ist vollständig dokumentiert und entworfen, um auf dem neuesten Stand zu bleiben IANA timezone database (auch wenn Sie die latest mess the Egyptian politicians have made - Änderung einer Zeitzone Regel mit einer ganzen 3 Tage im Voraus Ankündigung benötigen). Und wenn deine Zeitstempel antiquiert sind (sagen wir aus den 1940er Jahren), mach dir keine Sorgen. Diese Bibliothek unterstützt nahtlos den vollständigen Zeitzonenverlauf, den IANA bietet. Das heißt, wenn Daten in der IANA timezone database sind, extrahiert diese Bibliothek und verwendet sie ohne Fehler.

Sie können auch einfach und effizient Datumsliterale lokal in Berlin bilden, wenn dies für Ihre Anwendung hilfreich ist. Zum Beispiel, hier ist, wie Sie 15.30 Uhr am ersten Montag im Juli 2016 in Berlin geben würden (<chrono> Literale erfordern C++ 14):

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

Ausgang:

2016-07-04 15:30:00 CEST 

Wenn Sie möchten, um herauszufinden, welche Zeit hat das New Yorker Büro für dieses Treffen zu tele in:

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

Ausgang:

2016-07-04 09:30:00 EDT 

Hoffe das hilft.

Verwandte Themen