2011-09-28 2 views
1

Мне нужно получить красиво отформатированную временную метку (слегка измененную ISO 8601) с точностью до миллисекунды.Boost - форматирование времени субсекундной точности с отметкой времени

И пример даты будет выглядеть так: 2011-09-28 13:11:15.237-08:00
Форматирование также должно быть переписано.

Я играл с boost::posix_time::microsec_clock::local_time() и boost::posix_time::time_facet, который отлично работает, за исключением случаев, когда дело касается временных меток.
Со времени Posix не содержит информации о часовом поясе, это просто не возможно (я угадал)

Итак, есть ли что-нибудь еще, что я мог бы использовать, что есть миллисекунды точности, которая содержит информацию о временных зонах, или я могу сделать time_facet работать с часовыми поясами?

Возможно, я всегда должен использовать UTC?

Благодаря

ответ

4

Посмотрите на повышение :: класса LOCAL_TIME :: local_date_time. Вы можете указать часовой пояс и использовать локальные часы микросекунды, чтобы инициализировать его как

boost::local_time::local_date_time my_ldt(boost::local_time::local_microsec_clock::local_time(new boost::local_time::posix_time_zone("EST-5EDT,M4.1.0,M10.5.0"))); 

Затем вы должны быть в состоянии использовать грани для форматирования в строку.

Edit: Полный пример:

#include <iostream> 
#include <iomanip> 
#include <string> 
#include <sstream> 

#include <boost/date_time/local_time/local_time.hpp> 

int main(void) 
{ 
    boost::posix_time::ptime now = boost::posix_time::second_clock::local_time(); 
    boost::posix_time::ptime utc = boost::posix_time::second_clock::universal_time(); 

    boost::posix_time::time_duration tz_offset = (now - utc); 

    std::stringstream ss; 
    boost::local_time::local_time_facet* output_facet = new boost::local_time::local_time_facet(); 
    ss.imbue(std::locale(std::locale::classic(), output_facet)); 

    output_facet->format("%H:%M:%S"); 
    ss.str(""); 
    ss << tz_offset; 

    boost::local_time::time_zone_ptr zone(new boost::local_time::posix_time_zone(ss.str().c_str())); 
    boost::local_time::local_date_time ldt = boost::local_time::local_microsec_clock::local_time(zone); 
    boost::local_time::local_time_facet* output_facet = new boost::local_time::local_time_facet(); 
    ss.imbue(std::locale(std::locale::classic(), output_facet)); 
    output_facet->format("%Y-%m-%d %H:%M:%S%f%Q"); 
    ss.str(""); 
    ss << ldt; 
    std::cout << ss.str() << std::endl; // "2004-02-29 12:34:56.000789-05:00" 

    std::cout << "Press return to exit" << std::endl; 
    std::string wait_for_line; 
    std::getline(std::cin, wait_for_line); 

    return (0); 
} 
+0

Но я не хочу, чтобы указать часовой пояс, я, я хочу, чтобы система часовых поясов –

+0

@Nicklas A: К сожалению, пропустил это. Рассматривая этот вопрос (http://stackoverflow.com/questions/2136970/get-current-timezone-in-boost), вам нужно выполнить некоторые специфичные для ОС вызовы, чтобы получить текущий часовой пояс, а затем внедрить его в пользовательский часовой пояс Boost. – tinman

+0

Ах, тогда ваше решение, безусловно, самое лучшее, спасибо :) –

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