如何在没有前导零的情况下使用Boost.Date_Time进行格式化?

时间:2011-06-21 20:48:43

标签: c++ boost boost-date-time

如何在没有用零填充数字的情况下格式化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 个答案:

答案 0 :(得分:3)

据我所知,这个功能没有内置到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;
}

答案 1 :(得分:2)

我完全同意另一个回复:似乎没有格式化程序说明符给出日期的单个数字日期。

通常,有一种方法可以使用格式化程序字符串(几乎与常见的strftime格式相同)。这些格式说明符如下所示:"%b %d, %Y"

tgamblin提供了一个很好的解释here