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

可紊 提交于 2019-12-21 16:38:30

问题


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".


回答1:


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.




回答2:


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



来源:https://stackoverflow.com/questions/3854496/how-do-i-get-the-current-utc-offset-time-zone

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!