2010-10-04 4 views

ответ

14

Есть две части к этому вопросу:

  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() даст желаемого результата.

+0

Это сложный вопрос; например, конкретное смещение UTC может соответствовать, например, нескольким часовым поясам. – 2010-10-04 11:16:22

+0

@Roger: Итак ... Я думаю, правильный способ сказать, что я ищу смещение UTC для текущего времени, а не часового пояса? –

+1

Да, если это то, что вас интересует (это тоже то, что мне кажется), этот ответ на месте. Я ответил больше на то, что «локальный часовой пояс не очень хорошо проявляется в широко реализованном API». Просто имейте в виду, что UTC-компенсация, которую вы получите сегодня, может быть другой позже (или раньше). – 2010-10-04 11:31:37

1

Поскольку 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

Смежные вопросы