2011-06-21 12 views
3

どのようにしてにゼロを埋め込むことなく、boost :: posix_time :: ptimeオブジェクトをフォーマットできますか?例えばBoost.Date_Timeを先行ゼロなしでどのようにフォーマットしますか?

、私は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 

答えて

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; 
} 
+0

ありがとうございました。それをする必要はありませんでしたが、それは動作します。 – Eric

2

私は完全に他の回答に同意:一桁日の-ヶ月と日付を与えるフォーマッタ指定があるようには思えません。

一般に、フォーマッタ文字列(一般的なstrftimeフォーマットとほぼ同じ)を使用する方法があります。これらの書式指定子は、たとえば、"%b %d, %Y"のようになります。

tgamblinは、hereという素晴らしい説明を提供しました。

関連する問題