Этот вопрос состоит из двух частей:
- Получить смещение UTC как
boost::posix_time::time_duration
- Отформатируйте
time_duration
как указано
Очевидно, получение местного часового пояса не очень хорошо отражено в широко реализованном 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()
даст желаемый результат.