Search code examples
c++boost-date-time

How do I get the current UTC offset (time zone)?


How do I get the current UTC offset (as in time zone, but just the UTC offset of the current moment)?

I need an answer like "+02:00".


Solution

  • There are two parts to this question:

    1. Get the UTC offset as a boost::posix_time::time_duration
    2. Format the time_duration as specified

    Apparently, getting the local time zone is not exposed very well in a widely implemented API. We can, however, get it by taking the difference of a moment relative to UTC and the same moment relative to the current time zone, like this:

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

    Formatting the offset as specified is just a matter of imbuing the right time_facet:

    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();
    }
    

    Now, get_utc_offset_string() will yield the desired result.