2010-10-04 2 views

Antwort

14

Es gibt zwei Teile auf diese Frage:

  1. Holen Sie sich das UTC als Format boost::posix_time::time_duration Offset
  2. die time_duration wie angegeben

Offenbar ist die lokale Zeitzone bekommen ist in einer weit verbreiteten API nicht sehr gut dargestellt. Wir können es jedoch erhalten, indem die Differenz von einem Moment relativ zu UTC nehmen und demselben Moment in Bezug auf die aktuelle Zeitzone, wie folgt aus:

boost::posix_time::time_duration get_utc_offset() { 
    using namespace boost::posix_time; 

    // boost::date_time::c_local_adjustor uses the C-API to adjust a 
    // moment given in utc to the same moment in the local time zone. 
    typedef boost::date_time::c_local_adjustor<ptime> local_adj; 

    const ptime utc_now = second_clock::universal_time(); 
    const ptime now = local_adj::utc_to_local(utc_now); 

    return now - utc_now; 
} 

die wie angegeben Offset Formatierung ist nur eine Frage das Recht der Imbuing time_facet: Now

std::string get_utc_offset_string() { 
    std::stringstream out; 

    using namespace boost::posix_time; 
    time_facet* tf = new time_facet(); 
    tf->time_duration_format("%+%H:%M"); 
    out.imbue(std::locale(out.getloc(), tf)); 

    out << get_utc_offset(); 

    return out.str(); 
} 

, get_utc_offset_string() wird das gewünschte Ergebnis erzielen.

+0

Es ist eine komplizierte Angelegenheit; Ein bestimmter UTC-Offset kann beispielsweise mehreren Zeitzonen entsprechen. –

+0

@Roger: Also ... ich denke, der richtige Weg, es zu sagen ist, dass ich für die aktuelle Zeit den UTC-Offset suche, nicht die Zeitzone? –

+1

Ja, wenn es das ist, woran Sie interessiert sind (was auch für mich klingt), ist diese Antwort genau richtig. Ich reagierte mehr darauf, "dass die lokale Zeitzone in einer weit verbreiteten API nicht gut dargestellt wird". Beachten Sie jedoch, dass der UTC-Offset, den Sie für heute erhalten, später (oder früher) abweichen könnte. –

1

Da C++ 11 können Sie Chrono und std::put_time verwenden:

#include <chrono> 
#include <iomanip> 
#include <iostream> 
int main() 
{ 

    using sc = std::chrono::system_clock; 
    auto tm = sc::to_time_t(sc::now()); 

    std::cout << std::put_time(std::localtime(&tm), "formatted time: %Y-%m-%dT%X%z\n"); 

    std::cout << "just the offset: " << std::put_time(std::localtime(&tm), "%z\n"); 

} 

Dies erzeugt die folgende Ausgabe:

formatiert Zeit: 2018-02-15T10: 25: 27 + 0100

nur der Offset: 0.100

Verwandte Themen