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".
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".
There are two parts to this question:
boost::posix_time::time_duration
time_duration
as specifiedApparently, 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.
Since C++11 you can use chrono and std::put_time:
#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"); }
This produces the following output:
formatted time: 2018-02-15T10:25:27+0100
just the offset: +0100