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

发布于 2024-11-16 10:20:29 字数 525 浏览 2 评论 0原文

如何格式化 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

How can you format a boost::posix_time::ptime object without padding the numbers with zeros?

For example, I want to display 6/7/2011 6:30:25 PM and not 06/07/2011 06:30:25 PM.

In .NET, the format string would be something like "m/d/yyyy h:mm:ss tt".

Here is some code to do it the wrong way, just to get an idea:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

心意如水 2024-11-23 10:20:30

据我所知,此功能并未内置于 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;
}

To my knowledge this capability is not built into Boost.DateTime, but it's pretty trivial to write your own formatting functions, e.g.:

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;
}
桃扇骨 2024-11-23 10:20:30

我完全同意其他回复:似乎没有格式化说明符可以为日期提供单个数字日期。

一般来说,有一种方法可以使用格式化字符串(几乎与常见的 strftime 格式相同)。例如,这些格式说明符类似于:"%b %d, %Y"

tgamblin 在这里提供了很好的解释

I wholly agree with the other response: there does not seem to be a formatter specifier that gives the date with a single digit day-of-the-month.

In general, there is a way to use formatter strings (nearly identical to the common strftime formats). These format specifiers look like, for example: "%b %d, %Y".

tgamblin provided a nice explanation here.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文