Как получить текущее смещение UTC (часовой пояс)?

Как получить текущее смещение UTC (как в часовом поясе, но только смещение UTC текущего момента)?

Мне нужен ответ типа "+02:00".


person Magnus Hoff    schedule 04.10.2010    source источник


Ответы (2)


В этом вопросе две части:

  1. Получите смещение UTC как boost::posix_time::time_duration
  2. Отформатируйте 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() даст желаемый результат.

person Magnus Hoff    schedule 04.10.2010
comment
Это сложный вопрос; конкретное смещение UTC может соответствовать, например, нескольким часовым поясам. - person ; 04.10.2010
comment
@Roger: Итак ... Я думаю, правильно сказать, что я ищу смещение UTC для текущего времени, а не для часового пояса? - person Magnus Hoff; 04.10.2010
comment
Да, если это то, что вас интересует (что мне тоже кажется), этот ответ точен. Я больше отвечал на то, что локальный часовой пояс не очень хорошо отображается в широко реализованном API. Просто имейте в виду, что смещение UTC, которое вы получите сегодня, может быть другим позже (или раньше). - person ; 04.10.2010
comment
@Roger: я обновил свой вопрос, чтобы быть более точным. Конечно, ваш комментарий остается в силе в отношении получения местного часового пояса... :) - person Magnus Hoff; 04.10.2010

Начиная с C++11, вы можете использовать хроно и 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

person Spacemoose    schedule 15.02.2018