2009-06-30 8 views
1

は、この形式の日付に1日を追加する最も簡単な方法は何か++:ブースト日が1日追加、Cでは非標準GMT列

「20090629から05:57:43」おそらく使用して

ブースト1.36 - Boost::dateBoost::posix_dateまたは任意の他のブーストまたはstdライブラリ機能、私は他のライブラリに興味がありません。

は、これまでのところ私が思いついた:boost::gregorian::dateを初期化することができるように

  • 形式の文字列(文字列のOPとしてスプリット日付と時刻の部分)を、日付は次のようなフォーマットを期待:

    「2009- 6月29日午前5時57分43" 秒

    は私が持っている

    "20090629から05:57:43"

  • 追加1日(ブーストdate_durationもの)

  • が戻っto_simple_stringを変換し、時刻部分(文字列操作)を追加

これを行うには、任意のより簡単/ niftier方法はありますか?

実行効率を見ています。上記の手順について

例コード:

using namespace boost::gregorian; 
string orig("20090629-05:57:43"); 
string dday(orig.substr(0,8)); 
string dtime(orig.substr(8)); 

date d(from_undelimited_string(dday)); 
date_duration dd(1); 
d += dd; 
string result(to_iso_string(d) + dtime); 

結果:私が知っている最も簡単な方法にかなり近いです

20090630-05:57:43 

答えて

1

#include <iostream> 
#include <sstream> 
#include <locale> 
#include <boost/date_time.hpp> 

using namespace boost::local_time; 

int main() { 
    std::stringstream ss; 
    local_time_facet* output_facet = new local_time_facet(); 
    local_time_input_facet* input_facet = new local_time_input_facet(); 
    ss.imbue(std::locale(std::locale::classic(), output_facet)); 
    ss.imbue(std::locale(ss.getloc(), input_facet)); 

    local_date_time ldt(not_a_date_time); 

    input_facet->format("%Y%m%d-%H:%M:%S"); 
    ss.str("20090629-05:57:43"); 
    ss >> ldt; 

    output_facet->format("%Y%m%d-%H:%M:%S"); 
    ss.str(std::string()); 
    ss << ldt; 

    std::cout << ss.str() << std::endl; 
} 

しかし、長いだし、間違いなく難しい理解するために:文字列操作の必要性を排除するために、I/Oのもののためにファセットを使用することになり、さらにそれを簡素化するための唯一の方法について。私はそれを証明しようとしていないが、それはそれがほぼ同等の実行時効率となるだろうと思う。

+0

+1、面白い解決策、私は一見を持っています。ファセットをフォーマットに再利用して、それを介して日付を渡すことができると私は仮定します。 – stefanB

+0

できなかった理由はありません。 追加ポイント:これは現地時間を使用しているため、夏時間の変更に問題が生じることがあります。タイムゾーンをGMTに設定することで簡単に回避できますが、考慮する必要があります。私の特定のケースでは –

+0

私はGMT時間を扱っています – stefanB

関連する問題