如何获得当前的UTC偏移(时区)?

时间:2010-10-04 10:48:15

标签: c++ boost-date-time

如何获取当前的UTC偏移量(如时区,但只是当前时刻的UTC偏移量)?

我需要一个像“+02:00”这样的答案。

2 个答案:

答案 0 :(得分:15)

这个问题分为两部分:

  1. 将UTC偏移量设为boost::posix_time::time_duration
  2. 按指定格式time_duration

  3. 显然,在广泛实施的API中,获取本地时区并未得到很好的体现。但是,我们可以通过取相对于UTC的时刻和相对于当前时区的相同时刻来获得它,如下所示:

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

    根据指定格式化偏移量只需要输入正确的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();
    }
    

    现在,get_utc_offset_string()将产生所需的结果。

答案 1 :(得分:2)

从C ++ 11开始,你可以使用chrono和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");

}

这会产生以下输出:

  

格式化时间:2018-02-15T10:25:27 + 0100

     

只是偏移量:+0100