Как вы форматируете с Boost.Date_Time без начальных нулей? - PullRequest
3 голосов
/ 22 июня 2011

Как вы можете отформатировать объект boost :: posix_time :: ptime без дополнения чисел нулями?

Например, я хочу отобразить 6/7/2011 6:30:25 PM и , а не 06/07/2011 06:30:25 PM.

В .NET строка формата будет выглядеть примерно так: «m / d / yyyy h: mm: ss tt».

Вот код, который делает это неправильно, просто чтобы понять:

boost::gregorian::date baseDate(1970, 1, 1);
boost::posix_time::ptime shiftDate(baseDate);
boost::posix_time::time_facet *facet = new time_facet("%m/%d/%Y");
cout.imbue(locale(cout.getloc(), facet));
cout << shiftDate;
delete facet;

Output: 01/01/1970

Ответы [ 2 ]

3 голосов
/ 22 июня 2011

Насколько мне известно, эта возможность не встроена в Boost.DateTime, но довольно просто написать свои собственные функции форматирования, например:

template<typename CharT, typename TraitsT>
std::basic_ostream<CharT, TraitsT>& print_date(
    std::basic_ostream<CharT, TraitsT>& os,
    boost::posix_time::ptime const& pt)
{
    boost::gregorian::date const& d = pt.date();
    return os
        << d.month().as_number() << '/'
        << d.day().as_number() << '/'
        << d.year();
}

template<typename CharT, typename TraitsT>
std::basic_ostream<CharT, TraitsT>& print_date_time(
    std::basic_ostream<CharT, TraitsT>& os,
    boost::posix_time::ptime const& pt)
{
    boost::gregorian::date const& d = pt.date();
    boost::posix_time::time_duration const& t = pt.time_of_day();
    CharT const orig_fill(os.fill('0'));
    os
        << d.month().as_number() << '/'
        << d.day().as_number() << '/'
        << d.year() << ' '
        << (t.hours() && t.hours() != 12 ? t.hours() % 12 : 12) << ':'
        << std::setw(2) << t.minutes() << ':'
        << std::setw(2) << t.seconds() << ' '
        << (t.hours() / 12 ? 'P' : 'A') << 'M';
    os.fill(orig_fill);
    return os;
}
2 голосов
/ 22 февраля 2012

Я полностью согласен с другим ответом: не существует спецификатора форматера, который дает дату с одной цифрой день месяца.

В общем, есть способ использовать строки форматирования (почти идентичные обычным strftime форматам). Эти спецификаторы формата выглядят, например: "%b %d, %Y".

tgamblin предоставил хорошее объяснение здесь .

...